johnnian/Blog

Docker容器启动后自运行脚本的配置

johnnian opened this issue · 1 comments

使用Docker 的Centos镜像(官方版本),发现 Docker在启动的时候,不会运行 /etc/rc.d/rc.local 脚本。

原因是:

Docker 的上的操作系统镜像没有 init system,而普通的虚拟机有,因为带有完整的系统,在操作系统启动的过程中,会执行 boot 的所有初始化操作,但 Docker 则不是, Docker 只运行我们设置需要启动运行的脚本,否则不会自己运行。

如果需要Docker在启动后就自动运行 /etc/rc.d/rc.local,有下面的两种方式:

方法一:通过Docker命令

docker run image /bin/bash -c "/etc/rc.d/rc.local; <your command>"

eg.

docker run -itd myimage:test /bin/bash -c "/etc/rc.d/rc.local;/bin/bash"

方法二:通过DockerFile重新构建镜像,指定启动运行的服务

Dockerfile 示例如下:

FROM centos

MAINTAINER Johnnian<johnnian@126.com>

RUN <填写构建Docker时需要运行的命令>

ENV  MYENV /XX/XX

CMD <容器每次启动时运行的命令, 只能有一个CMD>

编写完后,运行:

docker build -t 镜像名:标签 <Dockerfile所在的目录>
# docker build -t centos:johnnian .

docker run -itd 新镜像名

附:参考现成的Dockerfile,如mysql的Dockerfile

参考链接

你好,请问一下:
1、在dockerfile的最后的 CMD 环节如果加了运行的脚本,那么在docker run的方式还可以执行脚本吗? 如果能执行脚本可以实现那种传递参数化的执行脚本吗?
2、这种在启动的时候进行脚本执行的方式是否也支持docker swarm?