我正在尝试使用ECS与travis进行部署。 有一次,一切正常,但现在已经停止了。
我正在关注本教程https://testdriven.io/part-five-ec2-container-service/
有两个任务一直停止和开始。
这些是我在任务中看到的消息:
TRemoteDataModule
这些是我在日志中看到的消息:
STOPPED (CannotStartContainerError: API error (500): oci ru)
STOPPED (Essential container in task exited)
为什么ECS会停止并启动这么多新任务?这种情况以前没有发生过。
这是我的主要微服务中的docker_deploy.sh,我是通过travis调用的。
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"
这是我的用户微服务的Dockerfile:
#!/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
entrypoint.sh:
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"]
我尝试删除我的群集并取消注册我的任务并重新启动,但ECS仍然会不断停止并立即启动新任务。
当它工作正常时:区别在于我的Dockerfile中没有#!/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
,而是
CMD ["./entrypoint.sh"]
特拉维斯正在过世。
答案 0 :(得分:1)
错误就在那里。
您的主机上没有足够的空间;并且entrypoint.sh
文件被拒绝。
确保您的主机有足够的磁盘空间(Shell和df -h
以检查和扩展卷,或者只调出一个有更多空间的新实例),并entrypoint.sh
确保构建映像时它是可执行文件chmod +x
,也可由容器正在运行的用户读取。
首先在本地测试您的容器;第二个错误应该立即被发现。
答案 1 :(得分:0)
如果运行的任务太多而且他们占用了空间,那么您将需要进入主机并执行以下操作。不要在-f
上使用docker rm
因为这会删除正在运行的ECS代理容器
docker rm $(docker ps -aq)
答案 2 :(得分:0)
Docker ps -a
导致所有已停止的容器被激发,这些也会消耗磁盘空间。使用下面的命令删除那些zoombie
docker rm $(docker ps -a | grep退出| awk'{print $ 1}')
同时删除较旧的图像或未使用的图像,这些图像占用的磁盘容量大于容器
docker rmi -f image_name