【发布时间】:2018-04-13 09:38:55
【问题描述】:
使用 Docker 镜像mysql:5.7.21 我想基于它创建一个新的镜像,该镜像已经初始化了它的数据库。 (我想将它用于我的接受环境)。
我知道/docker-entrypoint-initdb.d,我可以休耕:
FROM mysql:5.7.21
COPY ./init /docker-entrypoint-initdb.d
但问题是它只会复制 tar/sql 文件,但直到第一次运行时才会执行。另一个缺点也是图像大小。如果您在容器内复制例如 200MB 的数据,那么这些文件将保留在图像中(作为一个层)。
所以我想知道是否有我没有想到的与 multi-stage 或新的 --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
看到上面的内联 cmets... 发生了真正奇怪的事情吗?因此,当我在/var/lib/mysql 上执行ls -la 时,在同一个RUN 中,我可以看到这些文件。但是在新层(新 RUN)中它是空的:S
【问题讨论】:
-
您希望容器将数据存储在容器本身中吗?通常使用卷来存储数据。
-
是的,我想将数据存储在它自己的容器中。 (在这种情况下,它只是一个 10mb db,但将来可能会增加)。它将被部署到 Docker Swarm 环境中,我想让它尽可能简单(不设置持久卷)。
标签: mysql image docker continuous-integration containers