无法从不同主机部署docker容器



我正在将Docker集成到项目的持续集成中,因此每次提交时,它都会构建一个Docker映像,将其推送到私有注册表,并在运行OpenStack的机器上运行该容器。我们使用Ansible (v2.1)进行自动化,因此要与Docker交互,我使用docker_container模块。除了运行docker容器之外,我还需要注入一些配置文件,这些文件根据我部署到的环境而变化。我使用volumes选项注入配置文件。

一切似乎工作正常,我可以运行部署几次,docker容器得到正确替换…但是当相同的进程在不同的主机上运行时(比如我们的持续集成主机、Jenkins CI,或者只是另一台笔记本电脑),问题就开始了。docker映像是正确构建的,它被推送到私有注册表中,但是当它试图运行新容器时,它无法删除旧容器并停止。我得到以下可见的错误:

fatal: [host-1]: FAILED! => {"changed": false, "failed": true, "msg": "Error removing container xxxx: 500 Server Error: Internal Server Error ("Driver devicemapper failed to remove root filesystem xxx: remove /var/lib/docker/overlay/yyyy/merged: device or resource busy")"}

我使用以下docker_container任务来运行容器:

 - name: Run the application container
  docker_container:
    name: "myProject-{{ environment_env }}-app"
    image: "{{ docker_app_image }}"
    state: started
    pull: yes
    restart: yes
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - "{{ remote_home }}/myProject_{{ environment_env }}/log:{{ log_dir }}"
    - "{{ remote_home }}/myProject_{{ environment_env }}/local_settings.py:/server/cms/local_settings.py:ro"
    - "{{ remote_home }}/myProject_{{ environment_env }}/nginx.conf:/etc/nginx/nginx.conf:ro"
    - "{{ remote_home }}/myProject_{{ environment_env }}/myProject.pem:/etc/certificates/myProject.pem:ro"
    - "{{ remote_home }}/myProject_{{ environment_env }}/myProject_private.pem:/etc/certificates/myProject_private.pem:ro"
    - "{{ remote_home }}/myProject_{{ environment_env }}/myProject_vhost.conf:/etc/nginx/conf.d/myProject_vhost.conf:ro"

我已经尝试将docker驱动程序从devicemapper更改为overlay,但问题仍然相同。你们有人以前遇到过这个问题吗?它是否与运行部署的不同主机上的文件所有者或权限有关,并且docker系统无法管理?任何帮助将不胜感激!谢谢。

我自己贴出了答案,希望它能帮助到和我使用Docker有同样问题的人。

我遵循了这个指南,它基本上包括向docker systemd单元文件添加一个参数。我在[service]部分添加了MountFlags=private行。这个问题似乎与文件系统名称空间有关。有了这个修复,我可以在任意多的主机上部署容器,并且没有错误。