AWS ECS任务不断启动和停止

我正在尝试使用ECS与travis进行部署。 有一段时间一切正常,但现在停止了。

我正在按照这个教程https://testdriven.io/part-five-ec2-container-service/

有2个任务保持停止和启动。

这些是我在任务中看到的信息:

STOPPED (CannotStartContainerError: API error (500): oci ru) STOPPED (Essential container in task exited) 

这些是我在日志中看到的消息:

 FATAL: could not write to file "pg_wal/xlogtemp.28": No space left on device container_linux.go:262: starting container process caused "exec: \"./entrypoint.sh\": permission denied" 

为什么ECS停止并开始如此多的新任务? 这以前没有发生过。

这是我的主要微服务,我通过travis调用docker_deploy.sh。

 #!/bin/sh if [ -z "$TRAVIS_PULL_REQUEST" ] || [ "$TRAVIS_PULL_REQUEST" == "false" ]; then if [ "$TRAVIS_BRANCH" == "staging" ]; then JQ="jq --raw-output --exit-status" configure_aws_cli() { aws --version aws configure set default.region us-east-1 aws configure set default.output json echo "AWS Configured!" } make_task_def() { task_template=$(cat ecs_taskdefinition.json) task_def=$(printf "$task_template" $AWS_ACCOUNT_ID $AWS_ACCOUNT_ID) echo "$task_def" } register_definition() { if revision=$(aws ecs register-task-definition --cli-input-json "$task_def" --family $family | $JQ '.taskDefinition.taskDefinitionArn'); then echo "Revision: $revision" else echo "Failed to register task definition" return 1 fi } deploy_cluster() { family="testdriven-staging" cluster="ezasdf-staging" service="ezasdf-staging" make_task_def register_definition if [[ $(aws ecs update-service --cluster $cluster --service $service --task-definition $revision | $JQ '.service.taskDefinition') != $revision ]]; then echo "Error updating service." return 1 fi } configure_aws_cli deploy_cluster fi fi 

这是我的用户microservice的Dockerfile:

 FROM python:3.6.2 # install environment dependencies RUN apt-get update -yqq \ && apt-get install -yqq --no-install-recommends \ netcat \ && apt-get -q clean # set working directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # add requirements (to leverage Docker cache) ADD ./requirements.txt /usr/src/app/requirements.txt # install requirements RUN pip install -r requirements.txt # add entrypoint.sh ADD ./entrypoint.sh /usr/src/app/entrypoint.sh RUN chmod +x /usr/src/app/entrypoint.sh # add app ADD . /usr/src/app # run server CMD ["./entrypoint.sh"] 

entrypoint.sh:

 #!/bin/sh echo "Waiting for postgres..." while ! nc -z users-db 5432; do sleep 0.1 done echo "PostgreSQL started" python manage.py recreate_db python manage.py seed_db gunicorn -b 0.0.0.0:5000 manage:app 

我尝试删除我的集群,并注销我的任务,并重新启动,但ECS仍然不断停止,现在开始新的任务。

当它工作正常:不同的是,而不是我的Dockerfile中的CMD ["./entrypoint.sh"] ,我有

 RUN python manage.py recreate_db RUN python manage.py seed_db CMD gunicorn -b 0.0.0.0:5000 manage:app 

特拉维斯正在通过。

错误就在那里。

主机上没有足够的空间 和entrypoint.sh文件被拒绝。

确保你的主机有足够的磁盘空间(Shell in和df -h来检查和扩展卷,或者只是调出一个新的空间)和entrypoint.sh确保在构build映像的时候它是可执行的chmod +x和容器运行的用户也是可读的。

先在本地testing您的容器; 第二个错误应该是马上就被发现的。

如果运行的任务太多,而且他们已经占用了空间,那么您将需要向主机发送请求并执行以下操作。 不要在docker rm上使用-f ,因为这将删除正在运行的ECS代理容器

 docker rm $(docker ps -aq) 

做dockerps -a

这导致所有被激活的停止容器,这些也消耗磁盘空间。使用下面的命令来删除这些缩放比例

docker rm $(docker ps -a | grep Exited | awk'{print $ 1}')

同时移除较旧的影像或未使用的影像,这些影像需要比容器更多的DiskStation尺寸

docker rmi -f image_name