【问题标题】:Why does CTRL-C no longer stop my nginx container anymore?为什么 CTRL-C 不再停止我的 nginx 容器了?
【发布时间】:2018-02-06 15:26:33
【问题描述】:

我正在试验基于 nginx 的 Dockerfile。最后一行目前如下所示:

FROM nginx:alpine
... # not really relevant
CMD /bin/sh -c "envsubst < /etc/nginx/conf.d/site.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

现在当我使用docker run my-nginx-image 运行容器时,我注意到CTRL-C 不再停止容器。

在此更改之前,我最后有以下CMD 声明:

CMD ["nginx", "-g", "daemon off;"]

在这里,CTRL-C 按预期工作:容器已停止。这是为什么?我怎样才能拥有两个世界?

  • CTRL-C 工作
  • envsubst 包括

更新

经过阅读,我意识到我必须使用CMD [...] 进行引导。但我未能将整个命令 envsubst &lt; ... &gt; ... &amp;&amp; nginx -g 'daemon off;' 集成到 [...] 语法中。

【问题讨论】:

  • 你试过docker run -it my-nginx-image吗?
  • 不,还没有。我主要感兴趣的是如何让CMD [...] 语法在envsubst 中工作。我认为这将解决我的问题。

标签: docker nginx dockerfile


【解决方案1】:

https://forums.docker.com/t/docker-run-cannot-be-killed-with-ctrl-c/13108/2

所以这里有两个因素在起作用:

如果你为入口点指定一个字符串,像这样:

入口点/go/bin/myapp

Docker 使用 /bin/sh -c 'command' 运行脚本。这个中间 脚本获取 SIGTERM,但不将其发送到正在运行的服务器 应用程序。

为避免中间层,请将入口点指定为数组 字符串。

入口点 ["/go/bin/myapp"]

【讨论】:

  • 我试过这样做,但我没能弄清楚将envsubst &lt; ... &gt; ... &amp;&amp; nginx ... 集成到[ ... ] 语法中的语法。你能帮我解决这个问题吗?
  • 用你的命令创建一个 shell 脚本 docker-entrypoint.sh 并将这个脚本添加到 docker 镜像中。并在 CMD 中运行此脚本。不要忘记 chmod a+x... 类似 ADD docker-entrypoint.sh / RUN chmod a+x /docker-entrypoint.sh CMD ["/ /docker-entrypoint.sh"]
  • @Mosei 如果那个docker-entrypoint.shspwans另一个进程(例如nginx -g 'daemon off;',信号也会被转发到那个进程吗?
  • 我在stackoverflow.com/questions/48681357/… 上问过,这样cmets 就不会乱七八糟了。
猜你喜欢
  • 2017-11-29
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2011-04-06
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多