“重启:始终”策略如何在docker-compose中工作?

我有使用PostgreSQL和我的应用程序的docker compose文件,如下所示:

version: '3'

services:
  postgresql:
    image: postgres:9.6.6
    ports:
      - 9932:5432
    expose:
      - "5432"
    environment:
      - POSTGRES_PASSWORD=pass
    restart: always
    volumes:
      - /data:/var/lib/postgresql/data

  myapp:
    image: myapp
    links:
      - postgresql
    depends_on:
      - "postgresql"
    restart: always
    ports:
      - "5000:5000"

问题是重启:当我杀死容器(使用docker kill模拟应用程序崩溃)并且docker-compose没有重启我的容器时,总是策略似乎不起作用,即使退出代码是137.我观察到相同的行为时我使用restart:on-failure策略. docker-compose的版本2和3表现相同.我的系统是Ubuntu Server 16.04 x64.

我的问题是:

>为什么docker-compose不会重启崩溃(被杀)的容器?
>如何检查重启策略是否有效?

当您使用docker kill时,这是预期的行为,因为Docker不会重新启动容器:“如果您手动停止容器,则会忽略其重新启动策略,直到Docker守护程序重新启动或手动重新启动容器.这是另一种阻止尝试的尝试.重启循环“(reference)

如果您使用docker stop或docker kill,则手动停止容器.您可以对重新启动策略进行一些测试:重新启动docker守护程序,重新启动服务器,使用容器内的CMD并运行退出…

例如,如果我杀死使用重启策略部署的容器,我看到它退出了代码137但是根据docker ps -a它没有重新启动,它仍然退出:

[root@andromeda ~]# docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   3 minutes ago       Exited (137) 34 seconds ago                       keepalive_redis_1

但是如果我重启守护进程……

[root@andromeda ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   30 minutes ago      Up 2 seconds        6379/tcp            keepalive_redis_1

使用重新启动策略设置的容器再次启动,这是文档所说的,因此docker kill不是您应该测试重启策略的方式,因为它假定您故意停止容器并且Docker希望有办法阻止重新启动循环,如果你杀了它,你真的想要杀死它.

我发现以下链接有价值,在不同版本中显示相同的行为(因此它不是错误,而是预期的行为):

> How to ensure that containers restart
> The same behavior expected when you use docker kill
> And another post about docker kill and restart

翻译自:https://serverfault.com/questions/884759/how-does-restart-always-policy-work-in-docker-compose

转载注明原文:“重启:始终”策略如何在docker-compose中工作?