gpt4 book ai didi

java - Docker 禁用重启失败

转载 作者:行者123 更新时间:2023-12-02 18:19:59 25 4
gpt4 key购买 nike

以下情况:

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

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

我的“设置”: jetty 文件:

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" ]

用于创建 docker 服务的 YML 文件:

---
- 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文档中写到:

If you manually stop a container, its restart policy is ignored until the Docker daemon restarts or the container is manually restarted. This is another attempt to prevent a restart loop.

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

  • 但也许我可以在我的 Dockerfile 中写一些东西来实现我的目标?
  • 还是我完全错了,误解了文档?

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

最佳答案

有 4 个不同的 restart policies在 Docker 中:

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

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

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

关于java - Docker 禁用重启失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55740639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com