在VirtualBox虚拟机中用Molecule测试安装Docker的Ansible角色
兄弟,我完全懂你这个痛点!在Windows上靠VirtualBox跑Molecule,想通过Docker驱动测试你的Docker安装Ansible角色,结果容器里用systemctl启动Docker daemon死活不成功——这事儿我之前也踩过坑,给你几个亲测有效的办法:
默认的Docker容器没有足够权限运行systemd和Docker daemon,你需要修改molecule/default/molecule.yml的平台配置,给容器加特权模式,同时挂载systemd的cgroup目录并指定启动命令为init:
platforms: - name: centos7 image: centos:7 privileged: true # 赋予容器主机级权限,允许启动Docker daemon volumes: - /sys/fs/cgroup:/sys/fs/cgroup:ro # 挂载systemd依赖的cgroup文件系统 command: "/usr/sbin/init" # 让容器以systemd作为PID 1进程
这样容器启动后会完整运行systemd环境,你的Ansible角色里的systemctl start docker就能正常执行了。
如果不想折腾systemd的容器配置,也可以在你的Ansible角色里调整启动逻辑,直接调用dockerd命令后台启动:
- name: Install Docker packages yum: name: docker state: present - name: Start Docker daemon in background command: dockerd -H unix:///var/run/docker.sock async: 1000 # 异步执行,不阻塞后续任务 poll: 0 # 立即返回,让进程在后台运行 become: true
这种方式不需要依赖systemd,适合快速测试,但要注意后续任务如果需要Docker客户端连接,要等daemon完全启动后再执行(可以加个等待/var/run/docker.sock文件生成的任务)。
有些社区镜像已经帮你搞定了systemd和Ansible的环境,比如geerlingguy/docker-centos7-ansible,这类镜像专门为Molecule测试打造,直接用它作为基础镜像能省不少事:
platforms: - name: centos7 image: geerlingguy/docker-centos7-ansible privileged: true # 还是需要特权模式才能启动Docker daemon
启动后容器自带可用的systemd环境,你的角色可以直接用systemctl操作Docker服务。
另外还要注意:在VirtualBox里的虚拟机本身要确保Docker服务已经启动,而且运行Molecule的用户要有Docker操作权限(比如加入docker组,或者用sudo运行Molecule命令)。
内容的提问来源于stack exchange,提问作者Nicola Musatti

