Docker-Compose下Python应用与Celery Worker同代码基容器构建问题
解决Docker Compose下共享代码到Python应用和Celery Worker容器的问题
我来帮你搞定这个问题,不用调整现有目录结构就能实现把同一份代码复制到两个独立容器里。核心思路是利用Docker Compose的构建上下文配置,让两个服务的构建都以根目录为上下文,这样各自的Dockerfile就能访问到上级的/code文件夹了。
第一步:编写Docker Compose配置文件
在/application目录下创建docker-compose.yml,内容如下:
version: '3.8' services: app: build: context: . # 指定根目录/application为构建上下文,这样能访问到所有子目录 dockerfile: application-build/Dockerfile # 指向app服务的Dockerfile路径 # 根据需要添加其他配置,比如端口映射、环境变量 ports: - "5000:5000" environment: - CELERY_BROKER_URL=redis://redis:6379/0 celery-worker: build: context: . # 同样使用根目录作为构建上下文 dockerfile: celery-build/Dockerfile # 指向celery worker的Dockerfile路径 environment: - CELERY_BROKER_URL=redis://redis:6379/0 # 如果需要依赖消息队列,比如Redis,可以添加对应的服务 redis: image: redis:alpine
第二步:修改两个Dockerfile的复制指令
因为现在构建上下文是根目录,所以Dockerfile里的路径要从根目录下的code文件夹开始:
修改/application/application-build/Dockerfile
FROM python:3.6 # 复制整个code目录到容器内 COPY code/ . # 复制requirements.txt并安装依赖 COPY code/requirements.txt requirements.txt RUN python3.6 -m pip install -r requirements.txt # 启动应用 CMD ["python3.6", "application.py"]
修改/application/celery-build/Dockerfile
FROM python:3.6 # 复制整个code目录到容器内 COPY code/ . # 复制requirements.txt并安装依赖 COPY code/requirements.txt . RUN python3.6 -m pip install -r requirements.txt # 启动Celery Worker,这里用%h自动获取容器主机名,更灵活 CMD ["celery", "-A application.celery", "worker", "--hostname=work1@%h"]
第三步:构建并运行
在/application目录下执行以下命令:
# 构建镜像 docker-compose build # 启动所有服务 docker-compose up -d
为什么这个方案可行?
Docker的构建上下文是构建时Docker能访问到的文件目录,默认是Dockerfile所在的目录。通过在Docker Compose里把context指定为根目录/application,两个服务的构建过程都能访问到code文件夹,无需调整现有目录结构。同时每个服务依然使用自己独立的Dockerfile,保持了应用和Worker的部署独立性,方便后续分别扩缩容。
可选优化:复用依赖安装步骤(减少镜像体积)
如果想减少重复构建的时间和镜像体积,可以用多阶段构建或者单独的基础镜像来复用依赖安装的步骤:
- 在
/application下创建base-build/Dockerfile:
FROM python:3.6 COPY code/requirements.txt . RUN python3.6 -m pip install -r requirements.txt
- 修改app的Dockerfile:
FROM python:3.6 # 先从基础镜像复制已安装的依赖 COPY --from=base /usr/local/lib/python3.6/site-packages /usr/local/lib/python3.6/site-packages # 再复制代码 COPY code/ . CMD ["python3.6", "application.py"]
- 在docker-compose.yml里添加base服务的构建:
services: base: build: context: . dockerfile: base-build/Dockerfile # 其他服务保持不变,app和celery-worker的build配置里添加depends_on: [base]
这样依赖只需要安装一次,两个服务都可以复用,大大提升构建效率。
内容的提问来源于stack exchange,提问作者dben
相关产品推荐
相关产品推荐

