这几天我在学习 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
Run Code Online (Sandbox Code Playgroud)
docker 运行命令
docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误,因为我必须先执行mysql_install_db以初始化数据库。但是我无法添加RUN mysql_install_dbDockerfile,因为我想Volume用作外部数据存储。
那么我该怎么做呢?
我知道有一个名为mysql. 我只是想这样做作为练习。
更新:感谢@Pieter。我最终通过使用他的解决方案做到了这一点,该解决方案提供了另一个entrypoint.sh组合 init 和 start 脚本,然后将其作为 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
Run Code Online (Sandbox Code Playgroud)
入口点.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
Run Code Online (Sandbox Code Playgroud)
码头工人
docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql
Run Code Online (Sandbox Code Playgroud)
这为这种情况提供了通用解决方案。
我不是专家,但就我所知,没有办法在 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 entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 3306
Run Code Online (Sandbox Code Playgroud)
entrypoint.sh 看起来就像这样。
/usr/libexec/mysql_install_db --user=root
/usr/libexec/mysqld --user=root
Run Code Online (Sandbox Code Playgroud)
请注意,官方 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 的一部分运行。(这并不意味着您应该 -> 查看官方 mariadb 图像)。
docker run 命令使用基础映像中指定位置存在的任何数据初始化新创建的卷。见https://docs.docker.com/engine/reference/builder/#/volume
| 归档时间: |
|
| 查看次数: |
8845 次 |
| 最近记录: |