为了账号安全,请及时绑定邮箱和手机立即绑定

Docker禁用失败时重启

Docker禁用失败时重启

潇潇雨雨 2022-10-12 09:46:07
以下情况:我有一个 Spring Boot 应用程序在 Docker 群中运行但无法启动,因为它没有正确配置(缺少属性)。在我看来,docker swarm 总是试图重新启动容器,但由于缺少属性而总是失败。重新启动没有意义,因为除非我修复丢失的属性,否则 docker 将永远无法启动应用程序。所以目前这个群体在一个无限循环中结束。关于这个问题,我已经读过:码头工人文档:https ://docs.docker.com/config/containers/start-containers-automatically/和几个 StackOverflow 帖子:https ://stackoverflow.com/search?q=Docker+restart我的“设置”:dockerfile:ARG nexus_docker_registry=mynexus.com:10099FROM ${nexus_docker_registry}/openjdk:8-jdk-alpineADD myjar.jar myjar.jarENV JAVA_OPTS=""ENTRYPOINT [ "java", "-jar", "/myjar.jar" ]我的 YML 文件来创建 docker 服务:---- hosts: docker_manager  become: false  vars:    servicename: 'myservice'    imageurl: "mynexus.com:10099/myjar:{{version}}"    extraoptions:      - "--with-registry-auth"      - "--detach=true"      - "--log-driver gelf"      - "--log-opt 'gelf-address=udp://{{ groups['logstash'][0] }}:10001'"      - "--hostname 'myhost.com'"      - "--mount 'type=bind,source=/etc/localtime,destination=/etc/localtime:ro'"      - "--mount 'type=volume,source=mykeys,destination=/mykeys'"      - "--env 'spring.profiles.active=docker'"      - "--publish 8000:6666"  tasks:    - name: Include vault      include_vars: "myvault.yml"    - name: "delete service '{{ servicename }}'"      command: sudo docker service rm "{{ servicename }}"      args:        warn: false      ignore_errors: true      run_once: true    - name: "create service {{ servicename }}"      command: sudo docker service create {{ extraoptions | join( ' ' ) }} --name "{{ servicename }}" "{{ imageurl }}"      args:        warn: false      run_once: true我想要实现的是:如果 Spring Boot 应用程序由于例如 a 或类似原因而无法启动BeanCreationException,那么我不希望 docker 服务无休止地重新启动。如果我重新启动 swarm 等,docker 服务应该会自动重新启动。在 docker 文档中是这样写的:如果你手动停止一个容器,它的重启策略会被忽略,直到 Docker 守护进程重启或者容器被手动重启。这是防止重启循环的另一种尝试。所以我想我想通过重启策略来实现是不可能的。问题:但也许我可以写一些Dockerfile我实现目标的东西?还是我在这里完全错了并误解了文档?不幸的是,我不是码头工人专家,并且仍在学习处理“蜂群”。
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

Docker中有 4 种不同的重启策略:

  • no- 不要自动重启容器。(默认)

  • on-failure- 如果容器因错误退出,则重新启动容器,这表现为非零退出代码。

  • always- 如果容器停止,请始终重新启动容器

  • unless-stopped- 与 always 类似,除了当容器停止(手动或其他方式)时,即使在 Docker 守护程序重新启动后也不会重新启动。

docker 无法从应用程序中“检测”一种错误类型并根据它重新启动或不重新启动。

实现此目的的一种方法是在您的容器中使用supervisord,并让它根据您定义的退出代码列表来处理重启。但这意味着您的容器只会在 supervisord 崩溃时重新启动,而不是在您的应用程序崩溃时重新启动,并且您必须更改代码以针对应该重新启动的错误和不应该重新启动的错误返回不同的退出代码。


查看完整回答
反对 回复 2022-10-12
?
慕容3067478

TA贡献1773条经验 获得超3个赞

因为我想要实现的目标似乎不太可能,所以我再次阅读了文档(https://docs.docker.com/engine/reference/commandline/service_create/)并找到了可以--restart-max-attempts解决我的无限循环问题的选项.

查看完整回答
反对 回复 2022-10-12
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

您可能想尝试并实现docker stack基于 docker-compose 文件的创建。


在这种情况下,正如compose v3 文档所示,您可以完全控制服务重启策略。


下一个示例不允许重新启动:


version: "3.9"

services:

    python:

        image: my_user/my_repo:my_container

        volumes:

            - /home/python:/home

        deploy:

            restart_policy:

                condition: none

您可以使用和调整restart_policy块condition: [none | on-failure | any]max_attempts: [your_int]


查看完整回答
反对 回复 2022-10-12
  • 3 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信