如何向docker-compose传递动态参数且复用同一容器?
复用Docker容器执行带参数脚本,避免每次创建新容器
问题背景
我需要将脚本封装在Docker容器中,每天调用1-2次并传入动态参数。目前使用docker-compose run example param1 param2可以正常运行,但每次执行都会创建新容器,通过docker container ls -a能看到一系列带随机ID的容器(如docker-example-run-6bfcb8ba24c8)。我不想用--rm标志自动删除容器,而是希望始终复用同一个有固定名称的容器,方便通过docker logs查看日志。
现有代码
docker-compose.yml
version: '3.8' services: example: container_name: example build: .
Dockerfile
# syntax=docker/dockerfile:1 FROM debian:buster-slim COPY /scripts/example.sh /opt/app/entrypoint.sh RUN chmod +x /opt/app/entrypoint.sh ENTRYPOINT ["/opt/app/entrypoint.sh"]
example.sh
#!/bin/bash echo Your container args are: "$@" sleep 5 # 实际业务流程 echo finished
解决方案
核心思路是让容器保持长期运行状态,通过docker exec命令在同一个容器内重复执行脚本并传入参数,避免每次创建新容器。
步骤1:修改Dockerfile,让容器启动后保持运行
原Dockerfile的ENTRYPOINT直接执行脚本,脚本结束后容器就会退出。我们需要调整容器启动逻辑,让它启动后处于待命状态:
# syntax=docker/dockerfile:1 FROM debian:buster-slim COPY /scripts/example.sh /opt/app/example.sh RUN chmod +x /opt/app/example.sh # 启动后保持容器运行,不自动退出 CMD ["tail", "-f", "/dev/null"]
步骤2:调整docker-compose.yml(可选优化)
添加自动重启配置,确保容器意外退出后能自动恢复运行:
version: '3.8' services: example: container_name: example build: . restart: unless-stopped # 可选,容器意外停止时自动重启
步骤3:启动容器
执行以下命令启动容器并让它在后台运行:
docker-compose up -d
步骤4:复用容器执行脚本
每次需要运行脚本时,使用docker exec(或docker-compose exec)传入参数执行:
# 使用docker命令 docker exec example /opt/app/example.sh param1 param2 # 或使用docker-compose命令 docker-compose exec example /opt/app/example.sh param1 param2
查看日志
所有执行记录都会保存在同一个容器中,直接通过固定名称查看日志:
docker logs example # 实时查看日志 docker logs -f example
原理说明
docker-compose run的设计目标是临时创建容器执行一次性任务,执行完成后容器就会退出,因此每次运行都会生成新的容器实例。而docker exec是在已运行的容器内部执行命令,完全复用现有容器,不会产生新的容器记录。
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

