Docker禁用失败时重启

以下情况:

  • 我有一个 Spring Boot 应用程序

  • 在 Docker 群中运行

  • 但无法启动,因为它没有正确配置(缺少属性)。

  • 在我看来,docker swarm 总是试图重新启动容器,但由于缺少属性而总是失败。

  • 重新启动没有意义,因为除非我修复丢失的属性,否则 docker 将永远无法启动应用程序。

  • 所以目前这个群体在一个无限循环中结束。

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

我的“设置”:dockerfile:

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 应用程序由于例如 a 或类似原因而无法启动BeanCreationException,那么我不希望 docker 服务无休止地重新启动。

  • 如果我重新启动 swarm 等,docker 服务应该会自动重新启动。

在 docker 文档中是这样写的:

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

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

  • 但也许我可以写一些Dockerfile我实现目标的东西?

  • 还是我在这里完全错了并误解了文档?

不幸的是,我不是码头工人专家,并且仍在学习处理“蜂群”。


潇潇雨雨
浏览 99回答 3
3回答

慕码人8056858

Docker中有 4 种不同的重启策略:no- 不要自动重启容器。(默认)on-failure- 如果容器因错误退出,则重新启动容器,这表现为非零退出代码。always- 如果容器停止,请始终重新启动容器unless-stopped- 与 always 类似,除了当容器停止(手动或其他方式)时,即使在 Docker 守护程序重新启动后也不会重新启动。docker 无法从应用程序中“检测”一种错误类型并根据它重新启动或不重新启动。实现此目的的一种方法是在您的容器中使用supervisord,并让它根据您定义的退出代码列表来处理重启。但这意味着您的容器只会在 supervisord 崩溃时重新启动,而不是在您的应用程序崩溃时重新启动,并且您必须更改代码以针对应该重新启动的错误和不应该重新启动的错误返回不同的退出代码。

慕容3067478

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

慕田峪7331174

您可能想尝试并实现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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java