Docker容器间通信故障求助:docker exec执行grid product create命令返回非零退出状态1
解决Docker容器间执行
docker exec命令失败的问题 你的问题核心出在非交互式环境下使用了交互式终端参数,再加上缺少错误信息的排查路径,咱们一步步来解决:
1. 移除docker exec中的-it参数
你在subprocess里执行docker exec -it,但-t参数会分配伪终端(TTY),而subprocess是在无终端交互的环境下运行的,这个参数会直接导致命令执行失败。
把命令里的-it改成-i(如果需要读取标准输入的话),或者直接完全移除这两个参数:
cmdCreateProduct = 'docker exec gridd-alpha grid product create --owner myorg --file product.yaml'
2. 捕获错误输出,定位具体问题
目前你只捕获了命令成功的输出,但失败时的错误信息才是排查关键。暂时去掉check=True,同时打印stderr内容,这样能明确知道grid命令到底哪里出错了:
import subprocess cmdCpToContainer = 'docker cp product.yaml gridd-alpha:/' cmdCreateProduct = 'docker exec gridd-alpha grid product create --owner myorg --file product.yaml' # 先验证文件是否成功复制到目标容器 cmdCheckFile = 'docker exec gridd-alpha ls -l /product.yaml' resultCheck = subprocess.run(cmdCheckFile, shell=True, capture_output=True, universal_newlines=True) if resultCheck.returncode != 0: print(f"文件验证失败: {resultCheck.stderr}") else: print(f"文件状态: {resultCheck.stdout}") # 执行复制命令 resultCoppied = subprocess.run(cmdCpToContainer, shell=True, capture_output=True, universal_newlines=True) print('复制结果stdout: ' + resultCoppied.stdout) if resultCoppied.stderr: print('复制结果stderr: ' + resultCoppied.stderr) # 执行产品创建命令 resultCreatedProduct = subprocess.run(cmdCreateProduct, shell=True,capture_output=True , universal_newlines=True) print('创建结果stdout: ' + resultCreatedProduct.stdout) if resultCreatedProduct.stderr: print('创建结果stderr: ' + resultCreatedProduct.stderr)
运行这段代码后,你就能看到具体的错误提示,比如:
/product.yaml是否真的存在于目标容器grid命令是否有权限读取该文件grid命令本身的参数是否有误
3. 权限问题排查
如果错误提示是权限不足,你可以尝试两种解决方式:
- 在
docker exec中添加--user root参数,以 root 用户执行命令:cmdCreateProduct = 'docker exec --user root gridd-alpha grid product create --owner myorg --file product.yaml' - 或者在复制文件后修改文件权限:
cmdChmodFile = 'docker exec gridd-alpha chmod 644 /product.yaml' subprocess.run(cmdChmodFile, shell=True, capture_output=True, universal_newlines=True)
4. 其他注意事项
- 确保
djangoapp容器内已经安装了完整的docker-cli(你能执行docker cp说明已经安装,但可以再确认下版本兼容性) - 确认
gridd-alpha容器内的grid命令路径正确,必要时使用绝对路径执行(比如/usr/local/bin/grid)
按照这个流程排查,你应该能快速定位并解决问题。
内容的提问来源于stack exchange,提问作者Sharath Gowda
相关产品推荐
相关产品推荐

