如何在docker运行之后但在入口点之前只执行一次init脚本?

时间:2016-08-01 03:42:21

标签: docker

这些天我正在学习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

这为这种情况提供了通用的解决方案。

1 个答案:

答案 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

相关问题