为了测试目的,我想构建一个在其中引导数据集的 MySQL 容器。我知道可以挂载,并且可以将 sql 脚本放入 init 目录中以在启动时运行导入,但这不是我们想要的。所以我尝试自己构建一个,只需将数据文件复制到 docker 容器中。
我使用以下 dockerfile 来构建我的容器。
FROM mysql:8.0.21
EXPOSE 3306
ARG BUILD_ID
LABEL stage=builder
LABEL build=$BUILD_ID
ENV TZ=Europe/Amsterdam
RUN apt-get update && apt-get install -y tzdata
ADD http://server.example.com/data/datafiles_2020_11_02.tar.gz /var/lib/datafile.tar.gz
RUN tar -xvzf /var/lib/datafile.tar.gz -C /var/lib/mysql && chown -R mysql.root /var/lib/mysql
#ADD initieel/* /docker-entrypoint-initdb.d/
ADD cnf/* /etc/mysql/mysql.conf.d/
运行成功,之后我启动了新构建的容器,在启动过程中,容器中的某些东西将初始化一个新的数据库,并将我放入 /var/lib/mysql 的所有内容扔掉。我检查了 mysql 容器附带的 README,但没有找到与此相关的内容。
提前感谢您花时间阅读。如果我的帖子缺少任何信息,我会更新。
答案1
常见的方法是仅在需要时指定初始化。
不要直接放入 Dockerfile 中,而是RUN tar -xvzf /var/lib/datafile.tar.gz
将其放入添加到容器的 shell 脚本中,例如/opt/mysql-bootstrap.sh
。
然后,当您第一次在主机上创建容器时,使用该脚本运行 docker。
docker run --rm -v /path/to/var/lib/mysql:/var/lib/mysql \
--name my-mysql-bootstrap my-mysql:latest /opt/mysql-bootstrap.sh
初始化脚本运行后,将--rm
删除容器。之后,创建保留的容器:
docker run -v /path/to/var/lib/mysql:/var/lib/mysql \
--name my-mysql my-mysql:latest