docker-compose 入口点重启不是无状态的
docker-compose entrypoint restart not stateless
当我用 docker-compose up
和入口点重新启动容器时,它不是无状态的,它会保留先前执行入口点的上下文。
docker-编写文件:
version: '3.8'
services:
test:
image: debian:buster-slim
entrypoint: ["/entrypoint.sh"]
volumes:
- ./entrypoint.sh:/entrypoint.sh
command: ["echo", "100"]
entrypoint.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:
策略不兼容。
当我用 docker-compose up
和入口点重新启动容器时,它不是无状态的,它会保留先前执行入口点的上下文。
docker-编写文件:
version: '3.8'
services:
test:
image: debian:buster-slim
entrypoint: ["/entrypoint.sh"]
volumes:
- ./entrypoint.sh:/entrypoint.sh
command: ["echo", "100"]
entrypoint.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:
策略不兼容。