You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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查看。

解决步骤

  1. 确认Rootless用户的Docker套接字路径
    在目标服务器上以ansible_user身份登录,执行:

    echo $DOCKER_HOST
    

    输出通常为unix:///run/user/<UID>/docker.sock,记录该路径。

  2. 在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"
    
  3. 验证结果
    执行Playbook后,以ansible_user身份在目标服务器执行docker ps,即可看到Ansible启动的容器。

额外注意事项

  • 确保Ansible用户的环境变量DOCKER_HOST已正确配置(Rootless Docker安装后通常会自动写入~/.bashrc~/.profile),非交互式SSH连接可能需要手动加载配置,比如在Playbook中先执行source ~/.profile
  • Rootless Docker无需用户加入docker组,该组权限仅针对系统级Docker,保留反而容易混淆两个实例。

内容的提问来源于stack exchange,提问作者wickedchicken

火山引擎 最新活动