跳到主要内容

容器启动后自动执行脚本

PS:第一次run以及每次重启都会自动执行该脚本

方法一

Dockerfile加上CMD选项

CMD ["./xxxxx.sh"]

例:基于alpine镜像安装并启动一个名为"syncplay-server"的服务

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"]
#!/bin/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,否则启动即退出)

image.png

方法二

docker run 命令后面加上脚本

docker run images sh 'comand'

例:还是上面的例子,脚本相同,Dockerfile去掉CMD选项

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"

image.png

tail -f /dev/null 防止容器启动后退出

我们可以通过CMD、ENTRYPOINT或docker run后面接command参数,使容器启动时自动执行指定的命令,但一旦容器执行完所有命令,执行这些命令的终端就会销毁,容器就会自动退出,状态变成Exited。

这时候即使重启容器,还是会重蹈一样的过程和结果。

为什么在上面的两个例子中,容器不会自动退出?

因为以上脚本最后执行的其实是一个叫syncplay-server的python脚本,执行的时候会一直处于等待状态,也就是该终端永远不会关闭,容器也不会退出。

image.png

我们可以在脚本最后加上一句tail -f /dev/null,以达到同样的效果

#!/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
#我把脚本中的syncplay-server内容去掉,加上了tail -f /dev/null

image.png

只要tail -f /dev/null一直在运行,/bin/sh就不会关掉,容器也不会退出

参考: 利用tail -f /dev/null命令防止container启动后退出

ENTRYPOINT是什么? dockerfile中ENTRYPOINT命令详解