Rootless Docker环境中Ansible启动的容器仅sudo docker ps可见问题咨询
问题解决:Rootless Docker下Ansible容器仅sudo可见的处理
核心原因
Rootless Docker与系统级Docker是完全独立的运行实例,各自使用不同的套接字文件:
- 系统级Docker:
/var/run/docker.sock - Rootless Docker:通常是
$XDG_RUNTIME_DIR/docker.sock(会话级)或~/.docker/run/docker.sock(持久化)
Ansible的community.docker.docker_container模块默认连接系统级套接字,所以启动的容器属于系统级Docker,只能通过sudo docker ps查看。
解决步骤
确认Rootless用户的Docker套接字路径
在目标服务器上以ansible_user身份登录,执行:echo $DOCKER_HOST输出通常为
unix:///run/user/<UID>/docker.sock,记录该路径。在Ansible Playbook中指定Rootless套接字
调用docker_container模块时,通过docker_host参数指定Rootless用户的套接字路径:- name: 启动Rootless Docker容器 community.docker.docker_container: name: my-container image: nginx:alpine state: started docker_host: unix:///run/user/1000/docker.sock # 替换为实际UID对应的路径也可通过动态获取UID实现通用配置:
- name: 获取当前用户UID command: id -u register: user_uid - name: 启动Rootless Docker容器 community.docker.docker_container: name: my-container image: nginx:alpine state: started docker_host: "unix:///run/user/{{ user_uid.stdout }}/docker.sock"验证结果
执行Playbook后,以ansible_user身份在目标服务器执行docker ps,即可看到Ansible启动的容器。
额外注意事项
- 确保Ansible用户的环境变量
DOCKER_HOST已正确配置(Rootless Docker安装后通常会自动写入~/.bashrc或~/.profile),非交互式SSH连接可能需要手动加载配置,比如在Playbook中先执行source ~/.profile。 - Rootless Docker无需用户加入
docker组,该组权限仅针对系统级Docker,保留反而容易混淆两个实例。
内容的提问来源于stack exchange,提问作者wickedchicken




