在我的
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
从终端窗口退出。我在这里做错了什么?
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 脚本的东西。 👍