【问题标题】:Docker disable restart on-failureDocker禁用失败时重启
【发布时间】:2021-06-23 01:03:41
【问题描述】:

以下情况:

  • 我有一个 Spring Boot 应用程序
  • 在 Docker 群中运行
  • 但由于未正确配置(缺少属性)而无法启动。
  • 在我看来,docker swarm 总是试图重新启动容器,但由于缺少属性而总是失败。
  • 重新启动没有意义,因为除非我修复缺少的属性,否则 docker 将永远无法启动应用程序。
  • 因此,目前 swarm 以无限循环结束。

关于这个问题我已经读过:

我的“设置”: 泊坞窗文件:

ARG nexus_docker_registry=mynexus.com:10099
FROM ${nexus_docker_registry}/openjdk:8-jdk-alpine

ADD myjar.jar myjar.jar
ENV 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 应用程序由于 BeanCreationException 或类似原因而无法启动,那么我不希望 docker 服务无休止地重新启动。
  • 如果我重新启动 swarm 等,docker 服务应该会自动重新启动。

在docker文档中是这样写的:

如果你手动停止一个容器,它的重启策略会被忽略,直到 Docker 守护进程重启或者容器被手动重启。这是防止重启循环的另一种尝试。

所以我想我想通过重启策略实现的目标是不可能的。
问题:

  • 但也许我可以在我的Dockerfile 中写一些东西来实现我的目标?
  • 或者我在这里完全错了并且误解了文档?

不幸的是,我不是 docker 专家,但仍在学习处理“群”。

【问题讨论】:

    标签: java docker docker-swarm


    【解决方案1】:

    Docker中有4个不同的restart policies

    • no - 不要自动重启容器。 (默认)
    • on-failure - 如果容器因错误退出,则重新启动容器,这表现为非零退出代码。
    • always - 如果容器停止,请始终重新启动容器
    • unless-stopped - 与 always 类似,除了当容器停止(手动或其他方式)时,即使在 Docker 守护程序重新启动后也不会重新启动。

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

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

    【讨论】:

    • 感谢您的解释。这意味着我的假设是正确的,而 docker 没有提供这一点。由于您的回答,我找到了另一种实现我想要的方法。我将其发布为答案。
    【解决方案2】:

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

    【讨论】:

    • 知道是否可以在 docker-compose 中为docker stack deploy 实现它吗?
    • @RicarHincapie max_attempts 配置可用于基于文档的 docker-compose,但不能 100% 确定这是否适用于 docker stack deploydocs.docker.com/compose/compose-file/compose-file-v3
    【解决方案3】:

    您可能想尝试基于 docker-compose 文件创建 docker stack

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

    下一个示例不允许重启:

    version: "3.9"
    services:
        python:
            image: my_user/my_repo:my_container
            volumes:
                - /home/python:/home
            deploy:
                restart_policy:
                    condition: none
    

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

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      相关资源
      最近更新 更多