Docker отключить перезапуск при сбое - PullRequest
1 голос
/ 18 апреля 2019

Следующая ситуация:

  • У меня есть приложение Spring Boot
  • , который работает в рое Docker
  • , но не запускается из-за неправильной настройки (отсутствует свойство).
  • Мне кажется, что рой докеров всегда пытается перезапустить контейнер, но всегда терпит неудачу из-за отсутствующего свойства.
  • Перезапуск не имеет смысла, потому что docker никогда не сможет запустить приложение, пока я не исправлю отсутствующее свойство.
  • Так что в настоящее время рой заканчивается бесконечной петлей.

Относительно этой проблемы я уже читал:

Моя "настройка": Докер-файл:

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

Чего я хочу достичь:

  • Если приложение весенней загрузки не может запуститься из-за, например, BeanCreationException или чего-то подобного, то я не хочу, чтобы служба docker бесконечно перезапускалась.
  • Если я перезапущу рой и т. Д., Служба Docker должна перезапуститься автоматически.

В докерской документации написано:

Если вы остановите контейнер вручную, его политика перезапуска будет игнорироваться до тех пор, пока демон Docker не перезапустится или контейнер не будет перезапущен вручную. Это еще одна попытка предотвратить перезапуск цикла.

Так что я предполагаю, что то, чего я хочу достичь, невозможно с помощью политики перезапуска.
Вопросы:

  • но, может быть, я смогу написать что-нибудь в моем Dockerfile, чтобы достичь своих целей?
  • Или я здесь совершенно не прав и неверно истолковываю документацию?

Я, к сожалению, не специалист по докеру, и все еще учусь справляться с "роем".

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Поскольку кажется невозможным то, чего я хотел достичь, я снова прочитал документацию (https://docs.docker.com/engine/reference/commandline/service_create/) и нашел вариант --restart-max-attempts, который решит мою проблему с бесконечным циклом.

0 голосов
/ 18 апреля 2019

В Docker есть 4 различные политики перезапуска :

  • no - Не перезапускать контейнер автоматически. (по умолчанию)
  • on-failure - Перезапустить контейнер, если он выходит из-за ошибки, которая проявляется как ненулевой код выхода.
  • always - Всегда перезапускать контейнер, если он останавливается
  • unless-stopped - Аналогично всегда, за исключением того, что при остановке контейнера (вручную или иным образом) он не перезапускается даже после перезапуска демона Docker.

Docker не может «обнаружить» тип ошибки в приложении и перезапустить или нет, в зависимости от этого.

Один из способов добиться этого - использовать supervisord в вашем контейнере и позволить ему обрабатывать перезапуск в зависимости от заданного вами списка кодов выхода. Но это означает, что ваш контейнер будет перезапущен только при сбое supervisord, а не когда ваше приложение делает это, и вам придется изменить свой код, чтобы он возвращал разные коды выхода для ошибок, которые должны перезапускаться, и ошибок, которые не должны.

...