无法使用 ENTRYPOINT 和 CMD 的 exec 格式通过 CTRL+C 退出 docker run

问题描述 投票:0回答:1

在我的

Dockerfile
中,我之前使用了以下
CMD
以便 Apache 服务器启动,并且由于它在前台运行,容器将保持运行状态,我可以使用
CTRL
+
C
杀死它没有问题。

CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND", "-k", "start"]

此后我需要更新我的

Dockerfile
,以便我可以在 Apache 启动之前运行另一个脚本,因此我添加了一个入口点脚本并修改了我的 Dockerfile
...

Dockerfile

... EXPOSE 80 # Default process to run on container startup ENTRYPOINT ["/entrypoint.d/docker-entrypoint.sh"] # Default command to run container CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND", "-k", "start"]

docker-entrypoint.sh

#!/usr/bin/env bash # Inject Environment Variables source ${ENTRYPOINT_FOLDER}/env.sh # Run the main container process (from the Dockerfile CMD) exec "$@"
在这两个更新的命令中,我都使用 

ENTRYPOINT

CMD
 的 exec 形式,
CMD
 中设置的参数是使用入口点脚本中的 
exec "$@"
 行在前台启动 Apache,但这样做这不允许我再使用 
CTRL
 + 
C
 从终端窗口退出。

我在这里做错了什么?

docker docker-entrypoint docker-cmd
1个回答
1
投票
虽然我对

ENTRYPOINT

CMD
 使用了正确的执行形式,但退出信号仍然不起作用。

此问题的解决方案是在我的

-t

 调用中添加选项 
-i
docker run

之前:

docker run --env-file=<env-file-path> --rm -p 8080:80 ...
之后:

docker run --env-file=<env-file-path> -t -i --rm -p 8080:80 ...
参考:

https://github.com/moby/moby/issues/2838#issuecomment-29205965

我还想感谢 CharlesDuffy 帮助我解决这个问题,我从你那里学到了一些关于调试 bash 脚本的东西。 👍

© www.soinside.com 2019 - 2024. All rights reserved.