这些天我正在学习docker,并开始自己构建mysql图像。
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 run命令
docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql
这给出了一个错误,因为我必须先将mysql_install_db
执行到init DB。但我无法在Dockerfile中添加RUN mysql_install_db
,因为我想将Volume
用作外部数据存储。
那我该怎么做呢?
我知道这里有一张名为mysql
的官方图片。我只是想做这个练习。
更新:
感谢@Pieter。我最后通过使用他的解决方案来做到这一点,该解决方案提供了另一个entrypoint.sh
组合init和amp;启动脚本然后在Dockerfile中将其作为ENTRYPOINT:
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 run
docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql
这为这种情况提供了通用的解决方案。
答案 0 :(得分:4)
我没有专家,但据我所知,在ENTRYPOINT之前无法运行某些脚本,因为ENTRYPOINT实际上是容器运行的第一件事。
您可以做的是将自定义脚本添加到包含mysql_install_db和mysqld指令的docker容器中,并将其用作入口点。
所以你的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 docker图像中也使用了相同的技术。见https://github.com/docker-library/mariadb/tree/d969a465ee48fe10f4b532276f7337ddaaf3fc36/10.1
请注意,官方图像将ENTRYPOINT与CMD结合在一起。在您学习docker时,您可能需要查看https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/以获取有关ENTRYPOINT和CMD如何一起使用的更多信息。
<强>更新强> 假设mysql_install_db只是在/ var / lib / mysql下创建一些文件,你应该能够运行mysql_install_db作为docker build的一部分。 (这并不意味着您应该 - >&gt;看官方的mariadb图像。)
docker run命令使用基本映像中指定位置存在的任何数据初始化新创建的卷。见https://docs.docker.com/engine/reference/builder/#/volume