Docker dind无法执行docker命令:无法连接Docker守护进程问题咨询
我来帮你搞定这个问题!你遇到的错误核心原因是docker:dind容器里的Docker守护进程(dockerd)还没启动,就直接执行了docker login命令。下面分两种场景给你解决方案:
一、本地测试时的解决方法
你当前的命令docker run --rm -it docker:stable-dind docker login...其实是覆盖了docker:dind的默认启动入口(默认是启动dockerd),直接在容器里执行login命令,这时候守护进程根本没跑,自然连不上。正确的做法是:
- 先以交互模式启动dind容器,进入shell:
docker run --rm -it --privileged docker:stable-dind sh
注意:必须加
--privileged参数,因为dind需要访问宿主机内核资源来启动Docker守护进程。
- 在容器内部启动Docker守护进程(可以后台运行):
dockerd &
等待几秒,直到守护进程启动完成(你会看到类似API listen on /var/run/docker.sock的日志)。
- 现在再执行docker login命令:
docker login -u user -p password https://registry.mine.io
这时候就能正常连接到你的Nexus仓库了。
二、GitLab CI中的正确配置
既然你是要在GitLab CI里连接Nexus仓库,直接用上面的方法太麻烦,GitLab CI有更优雅的方式——通过services启动dind服务,让你的job容器直接复用这个守护进程:
首先确保你的GitLab Runner配置里开启了
privileged模式(在runner的config.toml里设置privileged = true),否则dind无法启动。在你的
.gitlab-ci.yml里这样写:
stages: - docker_login connect_nexus: stage: docker_login image: docker:stable services: - docker:stable-dind variables: # 让job容器连接到dind服务的Docker守护进程 DOCKER_HOST: tcp://docker:2375 # 禁用TLS(如果你的dind版本需要的话,新版本可能默认开启,根据情况调整) DOCKER_TLS_CERTDIR: "" script: - docker login -u $NEXUS_USER -p $NEXUS_PASSWORD https://registry.mine.io
建议把用户名和密码存在GitLab的CI/CD变量里($NEXUS_USER、$NEXUS_PASSWORD),不要明文写在配置里,更安全。
这样GitLab CI会自动启动docker:stable-dind服务容器,你的job容器(docker:stable)会通过DOCKER_HOST变量连接到这个服务里的Docker守护进程,直接就能执行docker命令,不需要手动启动dockerd。
内容的提问来源于stack exchange,提问作者ricko zoe

