问题描述:当运行一个容器的时候如何启动某些Service?
例如,已经在容器内安装了MySql 服务器,但在进入容器的时候
> docker run -it 09d18b9a12be /bin/bash
发现MySQL 服务并没有自动的启动。而是需要进入容器,手动的启动服务所需服务。
类似的问题还有,当我安装了SSHD服务,如何在容器运行的时候,自动的启动 ssh 服务?
> service ssh start
误区
在编写Dockerfile的时候,习惯性的以为 RUN 指令后面跟着想要启动的服务,在docker 容器内就会运行,但是实际上,RUN 指令后面跟着的命令,只会在生成镜像的时候,保存数据文件之类的,并不会保存任何运行的进程状态。这也是为什么,会有单独的 CMD
和 ENTRYPOINT
命令来指定,启动容器后的运行的命令。
还有一点就是,docker容器需要一个进程(最后一个命令)来保持运行容器状态的运行,否则该容器将退出/停止。这导致,正常的 service mysql start
之类的命令并不能直接的在Dockerfile文件中使用。
解决方案有:
-
在CMD指令后,接上一些不会终止结束的命令来保证进程的运行。例如
tail -F
.CMD service mysql start && tail -F /var/log/mysql/error.log
这种用法,通常在你之需要启动一个服务的情况下(首选)。
-
或者就是直接运行一些前台命令(不会终止的命令)
CMD /usr/bin/mysqld_safe
这种方案,只适用于你的服务有对应的前台命令。
-
就是将你的服务写入到一个
start.sh
脚本中,并且保持脚本的持续运行。CMD /start.sh
如果命令必须执行一系列步骤,这是最好的选择,同样,/ start.sh应该保持运行。
对于初学者,不建议使用supervisord(进程管理工具)。老实说,这太过分了。最好对容器使用单个服务/单个命令。详情参考Run multiple services in a container
顺便说一句(BTW):请检查https://registry.hub.docker.com以获取现有的mysql docker镜像以供参考
参考文档: