Docker容器执行完ENTRYPOINT自动退出如何将文件复制到本地?
解决方案
方法1:运行时覆盖ENTRYPOINT,执行完脚本后保持容器运行
你可以在docker run的时候覆盖默认的ENTRYPOINT,让容器执行完Python脚本后不立刻退出,之后就可以正常使用docker cp拷贝文件。
命令示例:
docker run -d --name test [image] sh -c "python3 main.py && tail -f /dev/null"
这里sh -c串起两个命令,先执行你的Python脚本生成目标文件,之后执行的tail -f /dev/null是无资源消耗的常驻命令,会让容器一直保持运行状态,等你拷贝完文件之后手动停止容器即可。
如果需要保留原ENTRYPOINT配置不想直接覆盖,也可以用--entrypoint参数指定shell:
docker run -d --name test --entrypoint sh [image] -c "python3 main.py && tail -f /dev/null"
方法2:直接挂载本地目录到容器输出路径,无需额外拷贝
如果你的Python脚本生成的文件是固定输出到某个目录的,直接把本地目录挂载到容器的对应输出路径,文件生成后会直接落到本地,完全不需要额外拷贝操作,也不用关心容器是否退出。
假设你的脚本生成的文件都存在容器内的/app/output目录下,运行命令示例:
docker run -d -v ./local_output:/app/output --name test [image]
运行完成后直接打开本地的./local_output目录就能拿到生成的文件,容器自动退出也不会产生任何影响。
方法3:修改Dockerfile的ENTRYPOINT为脚本控制退出逻辑
如果需要频繁调试、每次都要等拷贝完成再退出,可以把ENTRYPOINT改成自定义的启动脚本,增加等待逻辑。
- 首先新建
entrypoint.sh文件,内容如下:
#!/bin/sh # 先执行Python脚本 python3 main.py # 等待60秒预留拷贝时间,也可以自定义逻辑,比如判断某个标记文件存在再退出 sleep 60
- 修改Dockerfile,替换原来的ENTRYPOINT配置:
FROM python:3.9-alpine3.12 WORKDIR /app COPY . /app/ RUN pip install --no-cache-dir -r requirements.txt && \ rm -f /var/cache/apk/* && \ # 给启动脚本加执行权限 chmod +x entrypoint.sh ENTRYPOINT ["./entrypoint.sh"]
重新构建镜像后运行,容器执行完脚本会等待60秒再退出,足够你完成拷贝操作。
方法4:从已退出的容器中拷贝文件(无需修改启动逻辑)
注意:只要容器未被手动删除,无论处于运行还是退出状态,docker cp都可以正常读取容器内的文件
你可以正常运行容器,等它执行完自动退出之后,直接执行拷贝命令即可:
# 先确认容器存在,即使状态显示为Exited也不影响操作 docker ps -a # 拷贝容器内/app/路径下的目标文件到本地当前目录 docker cp test:/app/目标文件名 ./
拷贝完成之后再删除不需要的容器即可:docker rm test
内容的提问来源于stack exchange,提问作者user8750453
相关产品推荐
相关产品推荐

