docker stop不适用于节点进程

斯梅韦里特

我希望能够在docker容器内运行节点,然后能够运行docker stop <container>这应该使容器停止运行,SIGTERM而不是超时并执行操作SIGKILL不幸的是,我似乎丢失了一些东西,而我发现的信息似乎与其他地方相矛盾。

这是一个测试Dockerfile:

FROM ubuntu:14.04
RUN apt-get update && apt-get install -y curl
RUN curl -sSL http://nodejs.org/dist/v0.11.14/node-v0.11.14-linux-x64.tar.gz | tar -xzf -
ADD test.js /
ENTRYPOINT ["/node-v0.11.14-linux-x64/bin/node", "/test.js"]

这是test.jsDockerfile中提到的内容:

var http = require('http');

var server = http.createServer(function (req, res) {
  console.log('exiting');
  process.exit(0);
}).listen(3333, function (err) {
  console.log('pid is ' + process.pid)
});

我这样构建它:

$ docker build -t test .

我这样运行:

$ docker run --name test -p 3333:3333 -d test

然后我运行:

$ docker stop test

因此,SIGTERM显然无法正常工作,导致其在10秒后超时,然后死亡。

我发现,如果我从头开始执行节点任务,sh -c则可以^C从交互式(-it)容器中终止它,但仍然无法docker stop正常工作。这与我已读过的说法sh没有传递信号的意见相矛盾,但可能与我已读过的其他意见一致,即PID 1没有得到SIGTERM(因为它是通过shPID开始的,它将是PID 2)。

最终目标是能够docker start -a ...在新贵工作中运行并能够停止服务,并且实际上退出了容器。

斯梅韦里特

好的,我自己想出了一种解决方法,希望以此作为答案,希望它能对其他人有所帮助。它不能完全回答为什么以前的信号不起作用,但是确实给了我想要的行为。

使用baseimage-docker似乎可以解决此问题。这是我通过上面的最小测试示例进行的工作:

保持test.js原样。

修改Dockerfile为如下所示:

FROM phusion/baseimage:0.9.15

# disable SSH
RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh

# install curl and node as before
RUN apt-get update && apt-get install -y curl
RUN curl -sSL http://nodejs.org/dist/v0.11.14/node-v0.11.14-linux-x64.tar.gz | tar -xzf -

# the baseimage init process
CMD ["/sbin/my_init"]

# create a directory for the runit script and add it
RUN mkdir /etc/service/app
ADD run.sh /etc/service/app/run

# install the application
ADD test.js /

baseimage-docker包含一个init进程(/sbin/my_init),该进程处理启动其他进程并处理僵尸进程它使用runit进行服务监督。因此,Dockerfile将my_init进程设置为在启动时运行的命令,并/etc/service为runit添加了一个脚本来将其拾取。

run.sh脚本很简单:

#!/bin/sh
exec /node-v0.11.14-linux-x64/bin/node /test.js

别忘了chmod +x run.sh

默认情况下,runit将在服务关闭时自动重新启动该服务。

遵循这些步骤(并像以前一样构建,运行和停止),容器可以正确地及时响应关闭请求。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Docker Compose链接不适用于主机模式

来自分类Dev

Docker中的Apache重写不适用于PHP文件

来自分类Dev

docker cp不适用于此mysql容器

来自分类Dev

Xdebug连接不适用于PhpStorm和Docker

来自分类Dev

docker --add-hostname不适用于Windows容器

来自分类Dev

Bash Heredoc似乎不适用于Docker RUN语句

来自分类Dev

Docker中的Apache重写不适用于PHP文件

来自分类Dev

UFW规则不适用于Docker

来自分类Dev

docker cp不适用于此mysql容器

来自分类Dev

Docker Compose链接不适用于主机模式

来自分类Dev

.bash_profile 不适用于 docker php 图像

来自分类Dev

Docker seccomp适用于alpine / busybox但不适用于ubuntu

来自分类Dev

docker 子域 api.localhost 适用于 chrome 但不适用于终端

来自分类Dev

用于 php 的 docker 图像不适用于 Windows 10 浏览器

来自分类Dev

Webpack和React jsx-热加载不适用于Docker容器

来自分类Dev

docker中的端口映射不适用于python服务器

来自分类Dev

Docker-compose:nginx不适用于django和gunicorn

来自分类Dev

不适用于docker-compose版本2的容器之间的链接

来自分类Dev

JAVA_OPTS / CATALINA_OPTS参数不适用于docker-compose.yml

来自分类Dev

docker登录不适用于nexus 3私有注册表

来自分类Dev

Traefik 2.0-路径路由器规则不适用于docker标签

来自分类Dev

WordPress插件和主题不适用于WP-CLI和Docker Compose

来自分类Dev

Pytest不适用于Django和Docker-AssertionError:local('/ dev / console')不是文件

来自分类Dev

Spring Boot App + H2(在内存中)不适用于Docker容器

来自分类Dev

RabbitMQ Docker 容器不适用于 AWS EC2 实例

来自分类Dev

nginx-proxy 不适用于 swagger-ui docker container 502 Bad Gateway

来自分类Dev

在 Kestrel 中托管 Angular 应用程序不适用于 Docker

来自分类Dev

AppActivate不适用于进程ID

来自分类Dev

适用于Windows的Docker.io

Related 相关文章

  1. 1

    Docker Compose链接不适用于主机模式

  2. 2

    Docker中的Apache重写不适用于PHP文件

  3. 3

    docker cp不适用于此mysql容器

  4. 4

    Xdebug连接不适用于PhpStorm和Docker

  5. 5

    docker --add-hostname不适用于Windows容器

  6. 6

    Bash Heredoc似乎不适用于Docker RUN语句

  7. 7

    Docker中的Apache重写不适用于PHP文件

  8. 8

    UFW规则不适用于Docker

  9. 9

    docker cp不适用于此mysql容器

  10. 10

    Docker Compose链接不适用于主机模式

  11. 11

    .bash_profile 不适用于 docker php 图像

  12. 12

    Docker seccomp适用于alpine / busybox但不适用于ubuntu

  13. 13

    docker 子域 api.localhost 适用于 chrome 但不适用于终端

  14. 14

    用于 php 的 docker 图像不适用于 Windows 10 浏览器

  15. 15

    Webpack和React jsx-热加载不适用于Docker容器

  16. 16

    docker中的端口映射不适用于python服务器

  17. 17

    Docker-compose:nginx不适用于django和gunicorn

  18. 18

    不适用于docker-compose版本2的容器之间的链接

  19. 19

    JAVA_OPTS / CATALINA_OPTS参数不适用于docker-compose.yml

  20. 20

    docker登录不适用于nexus 3私有注册表

  21. 21

    Traefik 2.0-路径路由器规则不适用于docker标签

  22. 22

    WordPress插件和主题不适用于WP-CLI和Docker Compose

  23. 23

    Pytest不适用于Django和Docker-AssertionError:local('/ dev / console')不是文件

  24. 24

    Spring Boot App + H2(在内存中)不适用于Docker容器

  25. 25

    RabbitMQ Docker 容器不适用于 AWS EC2 实例

  26. 26

    nginx-proxy 不适用于 swagger-ui docker container 502 Bad Gateway

  27. 27

    在 Kestrel 中托管 Angular 应用程序不适用于 Docker

  28. 28

    AppActivate不适用于进程ID

  29. 29

    适用于Windows的Docker.io

热门标签

归档