You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:57:04