Docker容器内Git命令在服务器执行失败但本地正常
解决Satis Docker镜像Git克隆报错"cannot create async thread: Operation not permitted"的方案
问题重现
配置Satis Docker镜像刷新包时,触发Git克隆错误:
Failed to execute git clone --mirror -- 'git@git.domain.com:amp/support/db.git' '/root/.composer/cache/vcs/git-domain.com-amp-support-db.git/' Cloning into bare repository '/root/.composer/cache/vcs/git-domain.com-amp-support-db.git'... error: cannot create async thread: Operation not permitted fatal: fetch-pack: unable to fork off sideband demultiplexer
本地Docker环境运行镜像无此问题,已完成排查:
- 服务器容器内
ssh -T git@domain.com连接验证成功 - 直接执行Git克隆命令仍报错,更换
/tmp目录也无法解决 - 服务器CPU、内存使用率仅15%,资源充足
- 版本差异:服务器Docker 20.10.7、Git 2.7.1;本地Docker 24.0.2、Git 2.25.1
解决方案
1. 升级容器内Git版本
服务器使用的Git 2.7.1版本过旧,该版本在异步线程处理上存在兼容性问题。建议替换为更高版本:
- 在构建Satis镜像的Dockerfile中添加Git升级命令(以Debian/Ubuntu为例):
RUN apt-get update && apt-get install -y --no-install-recommends git=1:2.25.1-1ubuntu3.10 - 或者直接选用内置高版本Git的基础镜像(比如
php:8.2-cli搭配最新Git)。
2. 调整Docker容器安全权限
Docker 20.10.x默认的安全限制可能阻止容器内创建线程:
- 临时测试:运行容器时添加
--privileged参数验证是否为权限问题:docker run --privileged your-satis-image - 生产环境优化:若验证有效,可添加特定权限而非使用
--privileged:docker run --cap-add=SYS_ADMIN your-satis-image - 或修改Docker daemon的Seccomp配置,允许线程创建相关系统调用。
3. 禁用Git异步线程功能
针对旧版Git,通过配置强制禁用异步线程:
- 在容器内全局设置Git参数:
git config --global pack.threads 1 - 在Satis的
composer.json中添加Git选项:{ "config": { "git-options": "--no-single-branch" } }
4. 升级服务器Docker引擎版本
服务器Docker 20.10.7存在容器资源隔离的潜在bug,升级到与本地一致的24.0.x版本:
- 按照官方文档完成Docker引擎升级,消除版本差异带来的环境兼容性问题。
内容的提问来源于stack exchange,提问作者Sven van Zoelen
相关产品推荐
相关产品推荐

