我有一个要在ElasticBeanstalk上部署的多容器应用程序。以下是我的文件。

Dockerfile

FROM python:2.7

WORKDIR /app

ADD . /app

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y \
    apt-utils \
    git \
    python \
    python-dev \
    libpcre3 \
    libpcre3-dev \
    python-setuptools \
    python-pip \
    nginx \
    supervisor \
    default-libmysqlclient-dev \
    python-psycopg2 \
    libpq-dev \
    sqlite3 && \
    pip install -U pip setuptools && \
    rm -rf /var/lib/apt/lists/*

RUN pip install -r requirements.txt

EXPOSE 8000

RUN chmod +x entry_point.sh

docker-compose.yml
version: "2"
services:
  db:
    restart: always
    container_name: docker_test-db
    image: postgres:9.6
    expose:
      - "5432"
    mem_limit: 10m
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=docker_test

  redis:
    restart: always
    image: redis:3.0
    expose:
      - "6379"
    mem_limit: 10m

  web:
    # replace username/repo:tag with your name and image details
    restart: always
    build: .
    image: docker_test
    container_name: docker_test-container
    ports:
      - "8000:8000"
    environment:
      - DATABASE=db
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=docker_test
    mem_limit: 500m
    depends_on:
      - db
      - redis
    entrypoint: ./entry_point.sh
    command: gunicorn docker_test.wsgi:application -w 2 -b :8000 --timeout 120 --graceful-timeout 120 --worker-class gevent

  celery:
    image: docker_test
    container_name: docker_test-celery
    command: celery -A docker_test worker -l info
    links:
      - db
      - redis
    mem_limit: 10m
    depends_on:
      - web

  cbeat:
    image: docker_test
    container_name: docker_test-cbeat
    command: celery beat --loglevel=info
    links:
      - db
      - redis
    mem_limit: 10m
    depends_on:
      - web

在本地系统上运行文件时,我会工作。但是,当我将其上传到elasticbeanstalk时,出现了以下错误。



我通过使用container-transformdocker-compose.yml转换为Dockerrun.aws.json。对于上面的文件,下面是我的Dockerrun.aws.json
{
    "AWSEBDockerrunVersion": 2,
    "containerDefinitions": [
        {
            "command": [
                "celery",
                "beat",
                "--loglevel=info"
            ],
            "essential": true,
            "image": "docker_test",
            "links": [
                "db",
                "redis"
            ],
            "memory": 10,
            "name": "cbeat"
        },
        {
            "command": [
                "celery",
                "-A",
                "docker_test",
                "worker",
                "-l",
                "info"
            ],
            "essential": true,
            "image": "docker_test",
            "links": [
                "db",
                "redis"
            ],
            "memory": 10,
            "name": "celery"
        },
        {
            "environment": [
                {
                    "name": "POSTGRES_NAME",
                    "value": "postgres"
                },
                {
                    "name": "POSTGRES_USER",
                    "value": "postgres"
                },
                {
                    "name": "POSTGRES_PASSWORD",
                    "value": "postgres"
                },
                {
                    "name": "POSTGRES_DB",
                    "value": "docker_test"
                }
            ],
            "essential": true,
            "image": "postgres:9.6",
            "memory": 10,
            "name": "db"
        },
        {
            "essential": true,
            "image": "redis:3.0",
            "memory": 10,
            "name": "redis"
        },
        {
            "command": [
                "gunicorn",
                "docker_test.wsgi:application",
                "-w",
                "2",
                "-b",
                ":8000",
                "--timeout",
                "120",
                "--graceful-timeout",
                "120",
                "--worker-class",
                "gevent"
            ],
            "entryPoint": [
                "./entry_point.sh"
            ],
            "environment": [
                {
                    "name": "DATABASE",
                    "value": "db"
                },
                {
                    "name": "POSTGRES_NAME",
                    "value": "postgres"
                },
                {
                    "name": "POSTGRES_USER",
                    "value": "postgres"
                },
                {
                    "name": "POSTGRES_PASSWORD",
                    "value": "postgres"
                },
                {
                    "name": "POSTGRES_DB",
                    "value": "docker_test"
                }
            ],
            "essential": true,
            "image": "docker_test",
            "memory": 500,
            "name": "web",
            "portMappings": [
                {
                    "containerPort": 8000,
                    "hostPort": 8000
                }
            ]
        }
    ],
    "family": "",
    "volumes": []
}

我该如何解决这个问题?

最佳答案

请将镜像“docker_test”推送到dockerhub或ECR,以便Beanstalk从中提取镜像。目前,它在您的本地上,而ECS代理对此一无所知。

  • 标记并推送docker_test图像到dockerhub&ECR等注册表。
  • Dockerrun.aws.json更新图像存储库URL。
  • 允许Beanstalk提取图像。
  • 08-25 18:39