修改容器化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
相关产品推荐
相关产品推荐

