无法从不同的主机

时间:2016-10-16 13:18:59

标签: jenkins docker continuous-integration ansible containers

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

一切似乎都运行正常,我可以多次运行部署,docker容器被正确替换了......但是当从不同的主机运行相同的进程时问题就开始了(比如我们的Continous Integration主机,Jenkins CI,或者只是另一台笔记本电脑docker镜像构建正确,它被推送到私有注册表,但是当它尝试运行新容器时,它无法删除旧容器并停止。我收到以下ansible错误:

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系统无法管理它?任何帮助,将不胜感激!感谢。

1 个答案:

答案 0 :(得分:1)

我自己发布了答案,希望它可以帮助我解决与Docker相同的问题。

我遵循this guide,其基本上是在docker systemd单元文件中添加参数。我在MountFlags=private部分添加了[service]行。似乎该问题与文件系统命名空间有关。通过此修复,我可以从我想要的多个主机部署容器,并且有0个错误。