亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Docker禁用失敗時重啟

Docker禁用失敗時重啟

瀟瀟雨雨 2022-10-12 09:46:07
以下情況:我有一個 Spring Boot 應用程序在 Docker 群中運行但無法啟動,因為它沒有正確配置(缺少屬性)。在我看來,docker swarm 總是試圖重新啟動容器,但由于缺少屬性而總是失敗。重新啟動沒有意義,因為除非我修復丟失的屬性,否則 docker 將永遠無法啟動應用程序。所以目前這個群體在一個無限循環中結束。關于這個問題,我已經讀過:碼頭工人文檔:https ://docs.docker.com/config/containers/start-containers-automatically/和幾個 StackOverflow 帖子:https ://stackoverflow.com/search?q=Docker+restart我的“設置”:dockerfile:ARG nexus_docker_registry=mynexus.com:10099FROM ${nexus_docker_registry}/openjdk:8-jdk-alpineADD myjar.jar myjar.jarENV 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我實現目標的東西?還是我在這里完全錯了并誤解了文檔?不幸的是,我不是碼頭工人專家,并且仍在學習處理“蜂群”。
查看完整描述

3 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

Docker中有 4 種不同的重啟策略:

  • no- 不要自動重啟容器。(默認)

  • on-failure- 如果容器因錯誤退出,則重新啟動容器,這表現為非零退出代碼。

  • always- 如果容器停止,請始終重新啟動容器

  • unless-stopped- 與 always 類似,除了當容器停止(手動或其他方式)時,即使在 Docker 守護程序重新啟動后也不會重新啟動。

docker 無法從應用程序中“檢測”一種錯誤類型并根據它重新啟動或不重新啟動。

實現此目的的一種方法是在您的容器中使用supervisord,并讓它根據您定義的退出代碼列表來處理重啟。但這意味著您的容器只會在 supervisord 崩潰時重新啟動,而不是在您的應用程序崩潰時重新啟動,并且您必須更改代碼以針對應該重新啟動的錯誤和不應該重新啟動的錯誤返回不同的退出代碼。


查看完整回答
反對 回復 2022-10-12
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

因為我想要實現的目標似乎不太可能,所以我再次閱讀了文檔(https://docs.docker.com/engine/reference/commandline/service_create/)并找到了可以--restart-max-attempts解決我的無限循環問題的選項.

查看完整回答
反對 回復 2022-10-12
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

您可能想嘗試并實現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]


查看完整回答
反對 回復 2022-10-12
  • 3 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號