docker-compose 入口点重启不是无状态的

Posted

技术标签:

【中文标题】docker-compose 入口点重启不是无状态的【英文标题】:docker-compose entrypoint restart not stateless 【发布时间】:2021-12-01 04:59:18 【问题描述】:

当我使用带有入口点的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"]

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 restart同样的问题 【参考方案1】:

事实上,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 入口点重启不是无状态的的主要内容,如果未能解决你的问题,请参考以下文章

如何修复docker在ubuntu上docker-compose后进入重启状态的问题?

无法使用入口点运行 docker 容器

使用入口点脚本初始化 influxdb2 存储桶

Spring Boot:Oauth2:访问被拒绝(用户是匿名的);重定向到身份验证入口点

docker-compose 等待启动,直到挂载主机文件系统

如何使用 docker-compose 重启单个容器