Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker ECS集群中运行的Jenkins slave无法启动容器_Docker_Jenkins_Amazon Ecs_Jenkins Slave - Fatal编程技术网

Docker ECS集群中运行的Jenkins slave无法启动容器

Docker ECS集群中运行的Jenkins slave无法启动容器,docker,jenkins,amazon-ecs,jenkins-slave,Docker,Jenkins,Amazon Ecs,Jenkins Slave,我在AWS ECS集群中使用jenkins slave,我的配置如下: 正常情况下工作正常,但有时在高峰时间,从容器启动非常慢,超过40分钟,甚至无法启动容器 我必须终止ECS实例,然后启动一个新实例。当容器无法启动时,我在ecs代理中看到一个日志: 已停止,原因无法创建容器错误:API错误(500): devmapper:精简池有788个可用数据块,小于 最少需要4454个空闲数据块。在精简版中创建更多的可用空间 池或使用dm.min\u free\u space选项更改行为 这是我的doc

我在AWS ECS集群中使用jenkins slave,我的配置如下:

正常情况下工作正常,但有时在高峰时间,从容器启动非常慢,超过40分钟,甚至无法启动容器

我必须终止ECS实例,然后启动一个新实例。当容器无法启动时,我在ecs代理中看到一个日志:

已停止,原因无法创建容器错误:API错误(500): devmapper:精简池有788个可用数据块,小于 最少需要4454个空闲数据块。在精简版中创建更多的可用空间 池或使用dm.min\u free\u space选项更改行为

这是我的docker信息,请告诉我如何解决此问题

[root@ip-10-124-2-159 ec2-user]# docker info
Containers: 10
 Running: 1
 Paused: 0
 Stopped: 9
Images: 2
Server Version: 1.12.6
Storage Driver: devicemapper
 Pool Name: docker-docker--pool
 Pool Blocksize: 524.3 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: ext4
 Data file:
 Metadata file:
 Data Space Used: 8.646 GB
 Data Space Total: 23.35 GB
 Data Space Available: 14.71 GB
 Metadata Space Used: 2.351 MB
 Metadata Space Total: 25.17 MB
 Metadata Space Available: 22.81 MB
 Thin Pool Minimum Free Space: 2.335 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: true
 Deferred Deletion Enabled: true
 Deferred Deleted Device Count: 0
 Library Version: 1.02.93-RHEL7 (2015-01-28)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options:
Kernel Version: 4.4.39-34.54.amzn1.x86_64
Operating System: Amazon Linux AMI 2016.09
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 7.8 GiB
Name: ip-10-124-2-159
ID: 6HVT:TWH3:YP6T:GMZO:23TM:EUAA:F7XJ:ISII:QDE7:V2SN:XKFI:XPGZ
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Insecure Registries:
 127.0.0.0/8

我不知道为什么一次只能运行4个任务,即使ECS实例的资源仍然可用,我如何增加它

当你经常启动和停止容器时,你的问题是很常见的,你刚才提到的帖子就是关于这一点的!他们明确表示:

“AmazonEC2容器服务插件可以在您的计算机上启动容器 自动注册为Jenkins从属服务器的ECS群集, 在容器上执行适当的Jenkins作业,然后 “之后自动删除容器/构建从属”

问题是,如果停止的容器没有被清理,最终会耗尽内存,正如您所经历的那样。如果您
ssh
进入实例并运行以下命令,您可以自己检查这一点:

docker ps -a
docker rm -f $(docker ps -a -f status-exited)
如果在Jenkins遇到麻烦时运行此命令,您将看到一个几乎无穷无尽的已停止容器列表。您可以通过运行以下命令将其全部删除:

docker ps -a
docker rm -f $(docker ps -a -f status-exited)
但是,偶尔手动执行此操作确实不是很方便,所以您真正想要做的是在启动ECS实例配置时,在其userData参数中包含以下脚本:

ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION=1m >> /etc/ecs/ecs.config
ECS_CLUSTER=<NAME_OF_CLUSTER> >> /etc/ecs/ecs.config
ECS_DISABLE_IMAGE_CLEANUP=false >> /etc/ecs/ecs.config
ECS_IMAGE_CLEANUP_INTERVAL=10m >> /etc/ecs/ecs.config
ECS_IMAGE_MINIMUM_CLEANUP_AGE=30m >> /etc/ecs/ecs.config
ECS\u引擎\u任务\u清理\u等待\u持续时间=1m>/etc/ECS/ECS.config
ECS_CLUSTER=>>/etc/ECS/ECS.config
ECS\u DISABLE\u IMAGE\u CLEANUP=false>>/etc/ECS/ECS.config
ECS\u IMAGE\u CLEANUP\u INTERVAL=10m>>/etc/ECS/ECS.config
ECS\u IMAGE\u MINIMUM\u CLEANUP\u AGE=30m>>/etc/ECS/ECS.config
这将指示ECS代理启用清理守护程序,该守护程序每10分钟检查一次要删除的映像(这是您可以设置的最低间隔),在任务停止后1分钟删除容器,并删除30分钟前且不再被活动任务定义引用的映像。您可以了解有关这些变量的更多信息


根据我的经验,如果您非常快地启动和停止容器,那么这种配置可能不够,因此您可能希望在实例上附加一个合适的卷,以确保在守护进程清理停止的容器时有足够的空间进行操作

谢谢何塞的回答

但是,这个命令在Docker 1.12中对我有效*

docker rm $(docker ps -aqf "status=exited")

标记“q”从结果中过滤容器ID并将其删除。

如果您升级到最新的AWS客户端(或最新的ECS ami,amzn-ami-2017.09.d-amazon-ECS-optimized或更高版本),则您可以在ECS配置中为集群服务的EC主机进行配置

这将在和节点(标签){}子句之后进行清理,但在构建期间不会执行docker

  • 节点容器及其卷-已清理
  • 由在该节点上执行的步骤生成的docker图像-未清理

ECS对该节点上发生的事情视而不见。考虑到节点本身应该是最大的东西,ECS自动清理应该将运行单独清理任务的需要降至最低。

如此完美,我将在用户数据中添加ECS_ENGINE_task_CLEANUP_WAIT_DURATION=1m>/etc/ECS/ECS.config。由于我的ECS实例只使用1个镜像,所以不需要自动删除镜像,根据我的经验,如果你很快启动和停止容器,这种配置可能不够,因此,您可能希望在实例上附加一个合适的卷,以确保在守护进程清理停止的容器时有足够的空间继续运行=>您的意思是,如果我增加ECS实例的存储,它可以同时运行4个以上的任务定义?有点像,但不完全是:)。为了同时运行更多的任务定义,通常需要更多的CPU和内存。但是,容器也会消耗磁盘空间,包括停止的容器。因此,如果清理机制不够快,在某一点上,您将没有足够的空间来定义新容器。我希望这有帮助!