【问题标题】:AWS ECS tasks keep starting and stoppingAWS ECS 任务不断启动和停止
【发布时间】:2021-08-21 08:05:03
【问题描述】:

我正在尝试使用 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

这是我的用户微服务中的 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"]

入口点.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

特拉维斯路过。

【问题讨论】:

    标签: amazon-web-services docker amazon-ecs


    【解决方案1】:

    错误就在那里。

    您的主机空间不足;并且entrypoint.sh 文件被拒绝。

    确保您的主机有足够的磁盘空间(Shell in 和df -h 以检查和扩展卷或只是启动一个具有更多空间的新实例)并且对于entrypoint.sh 确保在构建映像时它是可执行的@ 987654324@ 并且容器运行时的用户也可以读取。

    首先在本地测试您的容器;第二个错误应该立即在开发中发现。

    【讨论】:

    • 我认为空间不够,因为它启动和停止了很多任务。
    • 任务不占用空间;图像可以 - 而且它只会下载一次图像。
    • 但在我尝试自动更新任务定义修订之前它工作正常。
    • @bohee-park;抱歉,如果您需要比我们提供的更多信息,您需要自己提供有关您的设置的更多信息。非常冗长。
    【解决方案2】:

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

    docker rm $(docker ps -aq)
    

    【讨论】:

      【解决方案3】:

      执行 docker ps -a

      这会导致所有停止的容器都被激发,这些也会消耗磁盘空间。使用下面的命令删除那些 zoombie

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

      并且还删除较旧的图像或未使用的图像,它们比容器占用更多的 DiskStation 大小

      docker rmi -f image_name

      【讨论】:

        【解决方案4】:

        我意识到这个答案与所提出的问题并非 100% 相关,但由于标题的原因,一些谷歌搜索将我带到了这里,我认为我的解决方案可能会帮助以后的人。

        我也遇到了这个问题,但是我的容器不断重启的原因不是空间或其他资源不足,而是因为我启用了动态主机端口映射并且忘记根据需要更新我的安全组。然后发生的事情是,我的负载均衡器发送到我的容器的运行状况检查不可避免地失败了,ECS 重新启动了容器(哎呀)。

        AWS 文档中的动态端口映射:

        tl;dr - 确保您的负载均衡器可以对端口 32768 - 65535 进行健康检查。

        【讨论】:

          猜你喜欢
          • 2019-05-20
          • 1970-01-01
          • 2020-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-12
          • 2023-01-18
          • 1970-01-01
          相关资源
          最近更新 更多