如何实现Docker容器启动时自动对挂载目录执行poetry update?
解决方案
问题出在你把poetry update放在了镜像构建阶段(RUN指令),而卷挂载是在容器启动时才完成的,构建阶段根本不存在/code目录,自然会报错。要实现容器启动时自动执行命令,需要把逻辑放到容器启动环节。
方法一:直接在ENTRYPOINT中组合命令
修改你的Dockerfile,移除构建阶段的错误指令,将poetry update和终端启动命令合并到ENTRYPOINT:
FROM python:3.10.4-slim-buster RUN pip install poetry WORKDIR /code # 启动时先执行poetry update,再进入bash终端 ENTRYPOINT ["/bin/sh", "-c", "poetry update && exec bash"]
这样容器启动时,会先在已挂载的/code目录执行poetry update,完成后进入bash终端,不影响你后续操作。
方法二:使用启动脚本(更易扩展)
如果后续需要添加更多启动逻辑,推荐用脚本的方式:
- 在项目根目录创建
start.sh脚本:
#!/bin/sh # 执行poetry update poetry update # 启动bash终端 exec bash
- 修改Dockerfile,复制脚本并设置执行权限:
FROM python:3.10.4-slim-buster RUN pip install poetry WORKDIR /code # 复制启动脚本 COPY start.sh /usr/local/bin/start.sh # 设置执行权限 RUN chmod +x /usr/local/bin/start.sh # 指定启动脚本为入口 ENTRYPOINT ["start.sh"]
关键说明
RUN指令:仅在镜像构建阶段执行,此时容器未启动,卷还未挂载,无法访问/code目录。ENTRYPOINT/CMD:在容器启动阶段执行,此时卷已经挂载完成,/code目录包含你本地的代码仓库,可以正常执行poetry update。
你的docker-compose.yml无需修改,保持原样即可。
内容的提问来源于stack exchange,提问作者Adjit
相关产品推荐
相关产品推荐

