Docker禁用重启失败

时间:2019-04-18 06:57:41

标签: java docker docker-swarm

以下情况:

  • 我有一个Spring Boot应用程序
  • 在Docker群中运行
  • 但由于配置不正确(缺少属性)而无法启动。
  • 在我看来,docker群总是尝试重新启动容器,但由于缺少属性而总是失败。
  • 重新启动没有意义,因为除非我修复丢失的属性,否则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应用程序由于BeanCreationException或类似原因而无法启动,那么我不希望Docker服务无限重启。
  • 如果我重新启动群集等,则docker服务应自动重新启动。

在docker文档中写道:

  

如果手动停止容器,则其重新启动策略将被忽略,直到Docker守护程序重新启动或手动重新启动容器为止。这是防止重新启动循环的另一种尝试。

因此,我想使用重新启动策略无法实现我想要的目标。
问题:

  • 但是也许我可以在Dockerfile中写一些达到目标的东西?
  • 还是我在这里完全错了并且误解了文档?

很遗憾,我不是Docker专家,仍然在学习处理“群”。

3 个答案:

答案 0 :(得分:0)

Docker中有4种不同的restart policies

  • no-不要自动重启容器。 (默认)
  • on-failure-如果容器由于错误而退出,则重新启动容器,该错误表现为非零退出代码。
  • always-如果容器停止,请务必重新启动
  • unless-stopped-与往常相似,除了在容器停止(手动或其他方式)时,即使重新启动Docker守护程序也不会重新启动容器。

泊坞窗无法从应用程序“检测”某种错误类型并重新启动或不重新启动。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可能想尝试实现基于 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

您可以使用 restart_policycondition: [none | on-failure | any]

调整 max_attempts: [your_int]