[英]docker-compose entrypoint restart not stateless
當我使用帶有入口點的docker-compose up
重新啟動容器時,它不是無狀態的,它會保留入口點之前執行的上下文。
docker-compose 文件:
version: '3.8'
services:
test:
image: debian:buster-slim
entrypoint: ["/entrypoint.sh"]
volumes:
- ./entrypoint.sh:/entrypoint.sh
command: ["echo", "100"]
入口點.sh文件:
#!/bin/bash
set -e
set -x
mkdir folder
exec "$@"
第一次登錄
Creating network "test_compose_entrypoint_default" with the default driver
Creating test_compose_entrypoint_test_1 ... done
Attaching to test_compose_entrypoint_test_1
test_1 | + mkdir folder
test_1 | + exec echo 100
test_1 | 100
如果我重新運行docker-compose up
,它第二次記錄
Starting test_compose_entrypoint_test_1 ... done
Attaching to test_compose_entrypoint_test_1
test_1 | + mkdir folder
test_1 | mkdir: cannot create directory 'folder': File exists
test_compose_entrypoint_test_1 exited with code 1
如果我運行docker-compose down
然后它再次運行,但不可能連續運行兩次。
實際上, docker-compose restart
嘗試在現有(已停止)容器中重新運行主容器進程。 docker-compose up
將默認重用現有容器,如果存在且配置正確,即使它已停止。 對於像您展示的那樣具有在干凈環境中開始的合理期望的設置,這可能是一個問題。
一種方法是圍繞目錄已經存在的可能性進行防御性編碼:
# Create `folder` only if it doesn't exist. Could still fail
# if the directory is read-only, or if `folder` is a plain file.
test -d folder || mkdir folder
在更高級別,您可以在重新啟動現有容器之前docker-compose rm
,或者如果您不介意重新啟動所有內容, docker-compose up --force-recreate
。 但是,這種方法與自動restart:
策略不兼容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.