如何在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