容器启动后自动执行脚本
PS:第一次run以及每次重启都会自动执行该脚本
方法一
Dockerfile加上CMD选项
CMD [“./xxxxx.sh”]
例:基于alpine镜像安装并启动一个名为”syncplay-server”的服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| FROM alpine:latest COPY syncplay-server_1.6.9.deb syncplay_start.sh syncplay / RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ && apk update RUN apk add --no-cache dpkg RUN apk add --no-cache py3-twisted py3-certifi py3-service_identity py3-idna CMD ["./syncplay_start.sh"]
installed=`ls /usr/bin/ |grep syncplay-server` if [ "$installed" == "" ]; then dpkg -i syncplay-server_1.6.9.deb fi running=`ps -ef |grep syncplay-server` if [ "$running" == "" ]; then syncplay-server else echo "syncplay-server aleady started" fi
|
构建镜像
#docker build -t oulh/syncplay-server:alpine .
启动容器
#docker run –name syncplay-server -d oulh/syncplay-server:alpine
(命令后面不能再加sh、/bin/sh,否则启动即退出)

方法二
docker run 命令后面加上脚本
docker run images sh ‘comand’
例:还是上面的例子,脚本相同,Dockerfile去掉CMD选项
1 2 3 4 5 6
| FROM alpine:latest COPY syncplay-server_1.6.9.deb syncplay_start.sh syncplay / RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ && apk update RUN apk add --no-cache dpkg RUN apk add --no-cache py3-twisted py3-certifi py3-service_identity py3-idna
|
构建镜像
#docker build -t oulh/syncplay-server:test .
启动容器
#docker run –name syncplay-test -d oulh/syncplay-server:test “./syncplay_start.sh”

tail -f /dev/null 防止容器启动后退出
我们可以通过CMD、ENTRYPOINT或docker run后面接command参数,使容器启动时自动执行指定的命令,但一旦容器执行完所有命令,执行这些命令的终端就会销毁,容器就会自动退出,状态变成Exited。
这时候即使重启容器,还是会重蹈一样的过程和结果。
为什么在上面的两个例子中,容器不会自动退出?
因为以上脚本最后执行的其实是一个叫syncplay-server的python脚本,执行的时候会一直处于等待状态,也就是该终端永远不会关闭,容器也不会退出。

我们可以在脚本最后加上一句tail -f /dev/null,以达到同样的效果
1 2 3 4 5 6 7
| #!/bin/sh installed=`ls /usr/bin/ |grep syncplay-server` if [ "$installed" == "" ]; then dpkg -i syncplay-server_1.6.9.deb fi tail -f /dev/null
|

只要tail -f /dev/null一直在运行,/bin/sh就不会关掉,容器也不会退出
参考:
利用tail -f /dev/null命令防止container启动后退出
ENTRYPOINT是什么?
dockerfile中ENTRYPOINT命令详解