Ubuntu 20.04下Makefile中$()语法无法获取Docker容器ID求助
问题分析与解决方法
一、先排查基础问题(shell测试无输出)
验证无sudo的docker命令是否正常
直接执行:docker create --rm wheel_img如果能输出容器ID,说明问题出在
sudo的环境配置上;如果仍无输出,检查:- 镜像
wheel_img是否存在:执行docker images | grep wheel_img确认。 - 镜像是否能正常创建容器:尝试
docker create --rm wheel_img echo test,若报错,根据错误提示修复镜像(比如镜像ENTRYPOINT配置异常)。
- 镜像
解决sudo下docker无输出的问题
如果不带sudo正常,带sudo无输出,尝试以下方法:- 使用docker绝对路径执行:
(路径可通过sudo /usr/bin/docker create --rm wheel_imgwhich docker获取) - 保留用户环境变量执行:
sudo -E docker create --rm wheel_img - 捕获stderr查看是否有隐藏错误:
若输出权限或路径相关错误,对应调整sudo配置或docker权限。sudo docker create --rm wheel_img 2>&1
- 使用docker绝对路径执行:
二、修复Makefile的语法问题
你的Makefile中$(sudo docker create --rm wheel_img)是Make的变量引用语法,而非shell的命令替换,这是核心问题。正确写法需要转义$,让shell处理命令替换:
修复后的Makefile片段:
deploy: python3 -m build sudo docker build . -t wheel_img sudo docker cp $$(sudo docker create --rm wheel_img):/tmp/xyz.whl wheelhouse/
更清晰的写法(拆分步骤):
deploy: python3 -m build sudo docker build . -t wheel_img @CONTAINER_ID=$$(sudo docker create --rm wheel_img); sudo docker cp $$CONTAINER_ID:/tmp/xyz.whl wheelhouse/
(@用于隐藏命令本身的输出,仅执行操作)
内容的提问来源于stack exchange,提问作者Seth
相关产品推荐
相关产品推荐

