我有Docker撰写文件与PostgreSQL和我的应用程序,就像这样:
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 )和docker – 撰写不重新启动我的容器,即使退出代码是137 。 当我使用restart: on-failure时,我观察到相同的行为restart: on-failure策略。 docker-compose的版本2和3的行为是一样的。 我的系统是Ubuntu服务器16.04 x64。
我的问题是:
当你使用docker kill的时候,这是Docker不会重启容器的预期行为:“如果你手动停止一个容器,它的重启策略会被忽略,直到Docker守护进程重启或者容器被手动重启为止。重启循环“ (参考)
如果你使用docker stop或者docker kill,你正在手动停止容器。 你可以做一些关于重启策略的testing:重启docker守护进程,重启你的服务器,使用一个容器中的CMD并运行一个退出…
例如,如果我杀死我的容器与重新启动策略部署,我看到它退出代码137,但它不会重新启动,根据泊坞器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并不是你应该testing重启策略的方式,因为它假定你故意停止了容器,而Docker想要阻止重启循环,如果你杀了它,你真的想杀了它。
我发现以下链接有价值,显示不同版本的相同行为(所以它不是一个错误,但预期的行为):