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

修改容器化Python脚本后,如何重新运行docker-compose?

问题

我是Docker新手,正在按照教程将自己的Python脚本容器化。发现修改myscript.py中的错误后,重新运行sudo docker-compose up无法识别更改,只有修改docker-compose.yml中的服务名称(如从my-awesome-app2改为my-awesome-app3)才能生效。我尝试列出并删除无用容器,但没有效果。请问如何让docker-compose识别Python脚本的修改,且无需修改Dockerfile?

配置文件

docker-compose.yml

version: "3"
services:
  my-awesome-app3:
    build:
      context: .

Dockerfile

FROM python:3.8.3
# Or any preferred Python version.
ADD myscript.py .
RUN pip3 install pywavelets scipy 
CMD ["python", "./myscript.py"] 
# Or enter the name of your unique directory and parameter set.

myscript.py

from scipy.misc import electrocardiogram

import pywt
import numpy as np
ecg = electrocardiogram()
FPData = ecg.reshape(10800,-1)
DWTcoeffs = pywt.wavedec(FPData[:,1], 'db4')
filtered_data_dwt=pywt.waverec(DWTcoeffs,'db4',mode='symmetric',axis=-1)
print(filtered_data_dwt)

错误示例

修改代码为print(filtered_data)后,重新运行sudo docker-compose up仍报错:

my-awesome-app2_1 | NameError: name 'filtered_data' is not defined


解决方案

1. 强制重新构建镜像再启动

Docker Compose默认会复用已有的镜像,修改脚本后需要强制重新构建镜像才能让更新生效,运行以下命令:

sudo docker-compose up --build

该命令会重新执行Dockerfile的构建流程,将更新后的myscript.py打包进新镜像,再用新镜像启动容器。

2. 挂载本地脚本到容器(开发阶段高效方案)

无需修改Dockerfile,直接在docker-compose.yml中添加volumes配置,把本地的myscript.py挂载到容器内对应路径,容器会直接读取本地脚本文件,修改后重启容器即可生效:
修改后的docker-compose.yml:

version: "3"
services:
  my-awesome-app3:
    build:
      context: .
    volumes:
      - ./myscript.py:/myscript.py  # 本地脚本挂载到容器内同路径

修改脚本后,只需执行以下命令重启容器:

sudo docker-compose restart

补充说明

  • 修改服务名称生效的原因:修改服务名称后,Docker Compose会将其视为全新服务,自动重新构建镜像,因此能用到新脚本,但这是低效的绕路方法,不推荐。
  • 删除容器无效的原因:容器基于镜像启动,旧镜像内还是修改前的脚本,删除容器后重新启动,Docker Compose依然会复用旧镜像,所以无法识别脚本修改。

内容的提问来源于stack exchange,提问作者Sheldon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:37:13