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


23

我有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"

问题是,restart: always当我终止容器(使用来模拟应用程序崩溃docker kill)时,策略似乎不起作用,并且即使退出代码为137,docker-compose也不会重新启动容器。使用restart: on-failure策略时,我观察到相同的行为。版本23docker-compose的行为相同。我的系统是Ubuntu Server 16.04 x64。

我的问题是:

  1. 为什么docker-compose不会重新启动已崩溃(被杀死)的容器?
  2. 如何检查重启策略是否有效?


1
我去过很多次,但是正如您所看到的那样,文档并不健全,也没有解释此功能的工作原理,这就是为什么我要问这个问题-我希望从具有该领域实际经验的人那里得到答案。
Marcin Zablocki

Answers:


20

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

如果您使用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希望有一种方法来防止重启循环,如果您杀死它,您真的想杀死它。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.