如何在docker运行之后但在入口点之前执行初始化脚本一次?
这些天我正在学习docker,并开始自己构buildmysql映像。
Dockerfile:
FROM centos MAINTAINER Michael ENV REFRESHED_AT 2016-07-29 RUN yum install -y mysql mariadb-server VOLUME /var/lib/mysql ENTRYPOINT ["/usr/libexec/mysqld", "--user=root"] EXPOSE 3306
docker运行命令
docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql
这给了一个错误,因为我必须首先执行mysql_install_db
初始化数据库。 但是我不能在Dockerfile中添加RUN mysql_install_db
,因为我想使用Volume
作为外部数据存储。
那我该怎么做呢?
我知道有一个名为mysql
的官方图像。 我只是想做这个练习。
更新:感谢@彼得。 我终于通过使用他的解决scheme来提供另一个entrypoint.sh
.sh结合init和start脚本,然后在Dockerfile中将其作为入口点:
FROM centos MAINTAINER Michael ENV REFRESHED_AT 2016-07-29 RUN yum install -y mysql mariadb-server VOLUME /var/lib/mysql COPY entrypoint.sh /usr/local/bin/ ENTRYPOINT ["entrypoint.sh"] EXPOSE 3306
entrypoint.sh
#!/bin/bash if [ ! -d "/var/lib/mysql/mysql" ]; then #check whether the DB is initialized. echo 'Initializing database' mysql_install_db echo 'Database initialized' fi /usr/libexec/mysqld --user=root
docker运行
docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql
这为这种情况提供了一个通用的解决scheme。
我不是专家,但是我知道在入口点之前没有办法运行一些脚本,因为ENTRYPOINT实际上是你的容器运行的第一个东西。
你可以做的是添加一个自定义脚本到你的docker容器,它包含了mysql_install_db和mysqld指令,并用它作为入口点。
所以你的dockerfile可能看起来像这样。
FROM centos MAINTAINER Michael ENV REFRESHED_AT 2016-07-29 RUN yum install -y mysql mariadb-server VOLUME /var/lib/mysql COPY start.sh / ENTRYPOINT ["/entrypoint.sh"] EXPOSE 3306
entrypoint.sh只是看起来像这样。
/usr/libexec/mysql_install_db --user=root /usr/libexec/mysqld --user=root
请注意,官方mariadb泊坞窗图像中也使用了相同的技术。 见https://github.com/docker-library/mariadb/tree/d969a465ee48fe10f4b532276f7337ddaaf3fc36/10.1
请注意,官方图片结合了入口点和CMD。 在学习docker的时候,你可能想看一下https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/了解更多关于入口点和CMD如何一起使用的信息。
更新假设mysql_install_db只是在/ var / lib / mysql下创build一些文件,你应该可以在你的docker build中运行mysql_install_db。 (这并不意味着你应该 – >看官方mariadb图像)。
docker run命令使用基础映像中指定位置上存在的任何数据初始化新创build的卷。 请参阅https://docs.docker.com/engine/reference/builder/#/volume