簡體   English   中英

docker-compose 入口點重啟不是無狀態的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM