Mac下使用Ansible docker_login模块报错:获取服务器API版本失败
Mac上Ansible docker_login模块连接Docker失败的解决方案
问题描述
在Mac系统上使用Ansible的docker_login模块登录私有Docker镜像仓库时失败,但该操作在最新版Ubuntu系统上可正常运行。
错误信息
"changed": false, "msg": "Error connecting: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))"
已尝试操作
已通过pip安装docker、docker-py和requests模块,但问题未解决。
我的Ansible代码
- name: Login to Docker Registry hosts: localhost tasks: - name: Install docker pip: name: docker - name: Install requests pip: name: requests - name: login docker_login: registry: "registryhidden" username: "user" password: "password" - name: Pull image docker_image: name: registryhidden/hellow-world:2.2.0 source: pull
Docker信息
Docker info Client: Context: desktop-linux Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc., v0.10.0) compose: Docker Compose (Docker Inc., v2.15.1) dev: Docker Dev Environments (Docker Inc., v0.0.5) extension: Manages Docker extensions (Docker Inc., v0.2.17) sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0) scan: Docker Scan (Docker Inc., v0.23.0) Server: Containers: 38 Running: 34 Paused: 0 Stopped: 4 Images: 33 Server Version: 20.10.22 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 2 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc Default Runtime: runc Init Binary: docker-init containerd version: 9ba4b250366a5ddde94bb7c9d1def331423aa323 runc version: v1.1.4-0-g5fd4c4d init version: de40ad0 Security Options: seccomp Profile: default cgroupns Kernel Version: 5.15.49-linuxkit Operating System: Docker Desktop OSType: linux Architecture: aarch64 CPUs: 4 Total Memory: 7.668GiB Name: docker-desktop ID: EGCA:3ZEX:YMYL:IUTN:FGUA:FOIQ:JIVQ:4B27:TMYK:3YDO:DSH2:WCN5 Docker Root Dir: /var/lib/docker Debug Mode: false HTTP Proxy: http.docker.internal:3128 HTTPS Proxy: http.docker.internal:3128 No Proxy: hubproxy.docker.internal Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: hubproxy.docker.internal:5000 127.0.0.0/8 Live Restore Enabled: false
解决方案
这个错误是因为Mac上Docker Desktop的Docker socket路径和Linux不同,Ansible默认查找的是/var/run/docker.sock,但Mac上Docker Desktop的socket实际路径是/Users/<你的用户名>/.docker/run/docker.sock,可通过以下三种方式解决:
方法1:在Ansible任务中指定Docker主机地址
修改docker_login和docker_image任务,添加docker_host参数指向Mac上的Docker socket:
- name: login docker_login: registry: "registryhidden" username: "user" password: "password" docker_host: unix:///Users/<你的用户名>/.docker/run/docker.sock - name: Pull image docker_image: name: registryhidden/hellow-world:2.2.0 source: pull docker_host: unix:///Users/<你的用户名>/.docker/run/docker.sock
注意替换<你的用户名>为实际的Mac用户名。
方法2:设置环境变量
在运行Ansible playbook前,设置DOCKER_HOST环境变量:
export DOCKER_HOST=unix:///Users/<你的用户名>/.docker/run/docker.sock
然后再执行ansible-playbook命令。
方法3:创建软链接
将Mac上的Docker socket链接到Linux默认路径:
sudo ln -s /Users/<你的用户名>/.docker/run/docker.sock /var/run/docker.sock
这样Ansible就能找到默认的socket路径,无需修改任务配置。
另外,需确认pip模块安装在Ansible使用的Python环境中。可通过ansible --version查看Ansible使用的Python路径,然后用对应pip安装模块:
/path/to/ansible/python -m pip install docker requests
内容的提问来源于stack exchange,提问作者dasharath Mangali
相关产品推荐
相关产品推荐

