gpt4 book ai didi

mysql - 如何创建初始化的 MySQL Docker 镜像?

转载 作者:行者123 更新时间:2023-11-29 17:46:09 26 4
gpt4 key购买 nike

使用 Docker 镜像 mysql:5.7.21 我想基于它创建一个新镜像,该镜像已初始化其数据库。 (我想将其用于我的接受环境)。

我知道 /docker-entrypoint-initdb.d 并且我可以执行以下操作:

FROM mysql:5.7.21

COPY ./init /docker-entrypoint-initdb.d

但问题是它只会复制tar/sql文件,但直到第一次运行时才会执行。另一个缺点也是图像尺寸。例如,如果您在容器内复制 200MB 的数据,那么这些文件将保留在镜像中(作为一层)。

所以我想知道是否有一个我没有想到的多阶段或新的 --squash 标志的组合(这将启用、添加文件、执行文件、删除文件)。

在搜索这个问题时,我还发现了 --datadir 标志。不确定这有什么帮助。

编辑:

到目前为止,我有以下内容:

FROM mysql:5.7.21 as builder

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
ENV MYSQL_DATABASE example

COPY ./init /docker-entrypoint-initdb.d

RUN head -n-2 < /usr/local/bin/docker-entrypoint.sh > /usr/local/bin/docker-entrypoint.sh \
&& docker-entrypoint.sh mysqld \
&& /etc/init.d/mysql start \
&& mysql -uroot -e 'FLUSH TABLES;' \
&& mysql -uroot -e 'show tables;' mysql \
&& mysql -uroot -e 'show tables;' example \
&& /etc/init.d/mysql stop \
# This shows the files!
&& ls -la /var/lib/mysql

# This shows no files?!!
RUN ls -la /var/lib/mysql

FROM mysql:5.7.21

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
ENV MYSQL_DATABASE example

COPY --from=builder /var/lib/mysql /var/lib/mysql
RUN ls -la

RUN ls -la /var/lib/mysql \
&& /etc/init.d/mysql start \
&& mysql -uroot -e 'show tables;' mysql \
&& mysql -uroot -e 'show tables;' example

看到上面的内联评论...发生了一些非常奇怪的事情?因此,在同一次运行中,当我在 /var/lib/mysql 上执行 ls -la 时,我可以看到这些文件。但在新层(新 RUN)中它是空的:S

最佳答案

所以我找到了解决方案!我的问题在于/var/lib/mysql 是一个卷: https://github.com/docker-library/mysql/blob/ad625c64a06e16683e997e5a0147508d115f4989/5.7/Dockerfile#L71

一个有效的多阶段 Dockerfile:

FROM mysql:5.7.21 as builder

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
ENV MYSQL_DATABASE example

COPY ./init /docker-entrypoint-initdb.d

RUN head -n-2 < /usr/local/bin/docker-entrypoint.sh > /usr/local/bin/docker-entrypoint.sh
RUN mkdir -p /var/lib/mysql_tmp
RUN docker-entrypoint.sh mysqld --datadir /var/lib/mysql_tmp

FROM mysql:5.7.21

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
ENV MYSQL_DATABASE example

COPY --from=builder /var/lib/mysql_tmp /var/lib/mysql_tmp

CMD ["mysqld", "--datadir", "/var/lib/mysql_tmp"]

所以我们在这里要做的是确保删除最后两行(可以更改为仅删除最后一行),因为它 contains exec "$@" 基本上意味着exec msqld。那是 MySQL 守护进程,因此它会卡在那里。

此外,我将数据目录从 var/lib/mysql (这是一个卷)更改为 var/lib/mysql_tmp (由于缺乏更好的名称)。

在最后阶段,我复制 var/lib/mysql_tmp 并确保 mysqld 使用该目录。

现在我可以为我的接受环境烘焙(对我来说只读)数据库。

关于mysql - 如何创建初始化的 MySQL Docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49813843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com