【问题标题】:Cannot deploy docker containers from different hosts无法从不同的主机部署 docker 容器
【发布时间】:2016-10-16 13:18:58
【问题描述】:

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

【问题讨论】:

  • 如果您从 CLI 运行 docker 命令(拉、停止、rm、运行),它们是否有效?您在故障节点上运行的是哪个版本的 docker?
  • @BMitch 是的,当我收到提到的容器移除失败的 Ansible 错误时,手动 CLI 命令docker rm 也会失败并出现相同的错误。我正在使用Docker 1.12.1,我必须销毁机器并重新创建它才能再次部署
  • 试一试 lsof 是否可以追踪对 docker 目录/文件的锁定访问。
  • @BMitch 我检查了它实际上是v1.12.0,还检查了 Docker GitHub 存储库并看到他们对v1.12.2 的最新更改日志包括“实施重试逻辑以防止使用 aufs 存储驱动程序时出现“无法删除文件系统”错误”,引用此 PR。我会检查问题是否在那个版本中仍然存在,如果是肯定的,也会使用lsof 命令检查
  • @BMitch 不幸的是,1.12.2 版本的问题似乎仍然存在 :( lsof 的输出有点怪异,4K 行和grep docker 的 650 行,我都上传到了GIST ,但我看不到任何看起来像 docker 安装卷的行,只有许多行引用 /var/lib/docker/volumes/metadata.db

标签: jenkins docker continuous-integration ansible containers


【解决方案1】:

我自己发布了答案,希望它能帮助遇到与 Docker 相同的问题的人。

我关注了this guide,它基本上包括向 docker systemd 单元文件添加一个参数。我在[service] 部分添加了MountFlags=private 行。似乎问题与文件系统名称空间有关。通过此修复,我可以从任意数量的主机部署容器,并且出现 0 个错误。

【讨论】:

  • 这个问题让我发疯了好几天。但是自从添加MountFlags=private 后的一天以来,我就没有遇到过这个错误。我简直不敢相信!谢谢你是那些回答他自己问题的人之一:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多