【发布时间】: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