FROM alpine:3.7
COPY popcorn.sh .
RUN chmod +x popcorn.sh
ENTRYPOINT ./popcorn.sh
ENTRYPOINT
指令使用的是 shell 模式,这样 Docker 就会把应用放到 shell
中运行,因此 shell
是 PID 1。
解决方案有以下几种:
方案 1:使用 exec 模式的 ENTRYPOINT 指令
与其使用 shell 模式,不如使用 exec 模式,例如:
FROM alpine:3.7
COPY popcorn.sh .
RUN chmod +x popcorn.sh
ENTRYPOINT ["./popcorn.sh"]
这样 PID 1 就是 ./popcorn.sh
,它将负责响应所有发送到容器的信号,至于 ./popcorn.sh
是否真的能捕捉到系统信号,那是另一回事。
举个例子,假设使用上面的 Dockerfile 来构建镜像,popcorn.sh
脚本每过一秒打印一次日期:
#!/bin/sh
while true
do
date
sleep 1
done
构建镜像并创建容器:
🐳 → docker build -t truek8s/popcorn .
🐳 → docker run -it --name corny --rm true