建立預先載入資料庫的 mysql 映像

建立預先載入資料庫的 mysql 映像

使用 mysql 的 Docker 映像,您可以將 mysqldump 腳本放入特定資料夾中,它將在首次啟動時使用這些腳本載入空資料。

我想知道如何創建一個圖像,其中執行已經作為構建的一部分進行,這樣我們就不必等待初始資料加載。

該映像的目的是為本地測試提供資料庫的開發人員副本。

如果可能的話,我希望將其作為多階段 Docker 建置來完成,這樣我就可以在建置伺服器上不安裝 MySQL 的情況下建置它。

雖然我還沒嘗試過,但我的整體思路如下:

FROM mysql as builder
COPY *.sql /somefolder
COPY buildscript.sh /buildscript.sh

FROM mysql
COPY --from build /var/lib/mysql /data # to avoid using the volume folder

buildscript.sh做了類似的事情

  1. 啟動mysqld
  2. 等待 mysqld 完全啟動(??)
  3. 運行用於建立資料的 SQL
  4. 關閉mysqld
  5. 同步(確保所有文件都已寫入)

答案1

我認為可以在 Dockerfile 中執行此操作,而不是在入口點執行操作。您應該將資料庫資料複製到映像中,並配置 my.cnf 以指向儲存該資料的目錄,並跳過進入入口點的轉儲操作。無論如何,作為個人考慮,您從中獲得了哪些好處?我的意思是,是的,您不必等待在運行時建立和填充資料庫,但每次重新建構映像都會花費您時間,並且還會使映像更大,因為其中包含一些資料。您必須考慮,如果您打算重新建置大量該映像,那麼時間成本不會發生很大變化,如果您不打算經常重新建置映像可能會是一個優勢。

答案2

這是我目前的工作解決方案。

我從Dockerfile

FROM mysql:5.7.23 as prep
COPY *.sql /docker-entrypoint-initdb.d/
COPY scripts/build-db.sh /
ARG MYSQL_ROOT_PASSWORD=my-very-secret
ARG MYSQL_USER=sampleuser
ARG MYSQL_PASSWORD=password123
RUN chmod u+x /build-db.sh
RUN /build-db.sh

FROM mysql:5.7.23
# use /data in my case so that it uses a directory that is not a VOLUME
COPY --from=prep /data /data

然後我新增一個build-db.sh集合採用現有的入口點.sh並取出最後exec一行以使其在完成初始化後停止。之所以放入數據,是/data因為預設情況下/var/lib/mysql在建置的下一階段不會包含任何數據。

#!/bin/bash
head -n -1 /usr/local/bin/docker-entrypoint.sh > /d2.sh
chmod +x /d2.sh
exec /d2.sh --datadir=/data

要啟動它,您需要--datadir=/data使用非卷目錄。

相關內容