使用docker-compose up重启带entrypoint容器非无状态报错问题
问题成因
docker-compose up 默认运行逻辑为:若本地存在对应停止状态的服务容器,会直接重启旧容器,而非创建全新容器。Docker容器的可写层会在容器生命周期内(从创建到删除)持久化保留所有写入操作,你首次运行时entrypoint.sh在容器可写层创建了folder目录,第二次重启旧容器时,目录已经存在,触发mkdir命令的报错,且你配置了set -e,脚本遇到错误直接终止退出。
而执行docker-compose down时会删除停止状态的旧容器,再次执行docker-compose up就会创建全新的空可写层容器,因此运行正常。
解决方案
你可以根据自己的使用场景选择以下任意一种方案:
- 修改
entrypoint.sh中的目录创建逻辑,使用mkdir -p folder替代原命令,-p参数会在目录已存在时直接返回成功,不会触发报错,是最简便的适配方案。 - 执行
docker-compose up时添加--force-recreate参数,强制每次都重新创建全新容器,丢弃旧容器的可写层数据,命令为:docker-compose up --force-recreate - 执行
docker-compose up时添加--rm参数,容器运行停止后自动删除,避免残留旧容器,命令为:docker-compose up --rm - 若
folder为临时使用的目录,可以在docker-compose.yaml的service配置中添加tmpfs挂载,将目录放到内存中,容器停止后数据自动清空,配置示例:
services: test: # 其他原有配置保留 tmpfs: - /folder
内容的提问来源于stack exchange,提问作者raphaelauv
相关产品推荐
相关产品推荐

