docker-compose exec踩坑记录
问题
在 docker-compose 中,-it(互动模式和伪终端)是属于 exec 子命令的参数,而不是 docker-compose 全局命令的参数。把它放在 exec 前面,Docker 会误以为这是 docker-compose 自身的参数,从而报错 unknown shorthand flag。
实际上,**docker-compose exec 默认就已经开启了 -it 效果**,你完全可以把 -it 直接删掉。
解决
正确的命令
请尝试直接**删掉 -it**,改用下面的命令:
1 | docker-compose exec yj_server bash -c 'pip install "tldextract>=3.4.4" && pip install -r <(grep -v -E "masonite==" yj_server/requirements.txt) -i http://mirrors.cloud.aliyuncs.com/pypi/simple --trusted-host mirrors.cloud.aliyuncs.com && pip install masonite==4.20.2 --no-deps' |
注意:(如果是新版 Docker Compose V2,命令中的
docker-compose也可以写成docker compose)
为什么这样就能解决?
- 参数顺序严格:Docker 的命令行解析对顺序要求很高。格式必须是
docker-compose [全局参数] exec [exec参数] 服务名 命令。 - **默认自带
-it**:与普通的docker exec不同,docker-compose exec在设计之初就默认自带了交互式终端分配(即-it),所以绝大多数情况下你不需要显式去写它。