Mysql

使用準備好的數據庫方案創建 docker mysql 容器

  • July 16, 2021

我想在 mysql 上創建一個 docker 鏡像,該鏡像已經包含我的應用程序所需的方案。

我嘗試向 Dockerfile 添加行,將我的方案作為 sql 文件導入。我是這樣做的(我的 Dockerfile):

FROM mysql

ENV MYSQL_ROOT_PASSWORD="bagabu"
ENV MYSQL_DATABASE="imhere"

ADD imhere.sql /tmp/imhere.sql

RUN "mysql -u root --password="bagabu" imhere < /tmp/imhere.sql"

據我了解,這不起作用,因為 mysql docker 映像不包含 mysql 客戶端(最佳實踐狀態“不要添加東西只是因為它們會很好”)(我錯了嗎?)

什麼可能是這樣做的好方法?我有一些想法,但它們似乎都是混亂的解決方法。

  1. 安裝 mysql 客戶端,做我必須做的事情,然後刪除/清除它。
  2. 將 mysql 客戶端二進製文件複製到映像中,做我必須做的,然後將其刪除。
  3. 在另一個 sql server 中創建模式並直接複製 db 文件本身(這看起來很混亂,對我來說聽起來像是一個受污染的問題池)

有什麼建議麼?希望以一種以後易於維護並且可能也符合最佳實踐的方式?

為了測試目的,我不得不這樣做。

以下是我利用 dockerhub 上的實際 MySQL/MariaDB 映像和多階段建構的方法:

FROM mariadb:latest as builder

# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY setup.sql /docker-entrypoint-initdb.d/

# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.
# https://docs.docker.com/engine/reference/builder/#volume :
#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after
#       it has been declared, those changes will be discarded.
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db", "--aria-log-dir-path", "/initialized-db"]

FROM mariadb:latest

COPY --from=builder /initialized-db /var/lib/mysql

完整的工作範例:https ://github.com/lindycoder/prepopulated-mysql-container-example

引用自:https://serverfault.com/questions/796762