与Django的AWS copilot从未完成部署

时间:2020-10-31 23:48:23

标签: django docker docker-compose amazon-ecs copilot

我遵循了这个简短指南,使用docker创建了django应用 https://docs.docker.com/compose/django/

,然后按照副驾驶员的指示将容器推至ECS: https://aws.amazon.com/blogs/containers/introducing-aws-copilot/

我还使用了此示例来测试所有内容-效果很好: https://github.com/aws-samples/aws-copilot-sample-service 部署完成,并输出和URL端点。

就我而言,所有内容均已成功构建,但是一旦部署了测试环境,它便会在此持续构建:

72ff4719 size: 3055
⠏ Deploying load-bal:7158348 to test.

并且永远不会结束。我什至将我的requirements.txt文件缩小到最小。

我的Dockerfile

FROM python:3.7.4
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
EXPOSE 80
COPY . /code/

docker-compose.yml

version: "3.8"
   
services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

requirements.txt

Django==3.0.8
djangorestframework==3.11.0
gunicorn==20.0.4
pipenv==2020.6.2
psycopg2-binary==2.8.5
virtualenv==16.7.6

我遵循的说明:

sudo docker-compose run web django-admin startproject composeexample .

成功创建Django应用

copilot init

应用程序和负载均衡器的设置命名

选择创建测试环境

一切都成功构建,然后就坐在这里。我已经尝试了多种变体,但是唯一可行的方法就是在没有django的情况下进行副驾驶教学。

6f3494a64128: Pushed 
cfe650cc4def: Pushed 
a477d6671cc7: Pushed 
90df760355a7: Pushed 
574ea6c52bdd: Pushed 
d1573fad78d1: Pushed 
14c1ff636882: Pushed 
48ebd1638acd: Pushed 
31f78d833a92: Pushed 
2ea751c0f96c: Pushed 
7a435d49206f: Pushed 
9674e3075904: Pushed 
831b66a484dc: Pushed 
ini: digest: sha256:b7460876bc84b1a26e7513fa6d17b5bffd5560ae958a933984376ed2c9fe53f3 size: 3052
⠏ Deploying aiinterview-lb:ini to test. 

1 个答案:

答案 0 :(得分:2)

tl; dr,出于Copilot的目的,本教程使用的Dockerfile是不完整的。它需要多一行包含

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

EXPOSE指令应更新为8000。由于Copilot无法识别Docker Compose语法,并且Dockerfile中没有指定命令或入口点,因此映像永远不会以Copilot的配置设置开头。

详细信息

AWS Copilot是围绕“服务”设计的,该“服务”包括映像,可能的辅助工具和其他存储资源。这意味着它的基本配置单位是Docker映像和服务清单。它本身不读取Docker Compose语法,因此Copilot知道的所有配置都是Dockerfile或映像中以及每个服务的manifest.ymladdons目录中指定的配置。

在此示例中,该Dockerfile设计用于Docker Compose,没有任何CMDENTRYPOINT指令,因此由Copilot推送到Amazon ECR的构建映像将不会'永远不要开始。本教程将图像的命令(python manage.py runserver 0.0.0.0:8000)指定为docker-compose.yml中的替代项,因此您需要将Dockerfile更新为以下内容:

FROM python:3.7.4
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
EXPOSE 8000
COPY . /code/
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

请注意,我已将EXPOSE指令更改为8000,以匹配docker-compose.yml中的命令,并将web部分中指定的命令作为{{1 }}指令。

您还将想要运行

CMD

这将创建您的copilot init --image postgres --name db --port 5432 --type "Backend Service" --deploy 中指定的数据库服务。您可能需要先运行此程序,以使Web容器在搜索凭据时不会失败。

其他一些注意事项:

  • 您可以通过在工作空间中docker-compose.yml上创建的variables的清单文件中添加secretsdb来指定数据库凭据。有关如何向SSM添加秘密并使其可用于Copilot服务的更多信息,请check out our documentation
./copilot/db/manifest.yml
  • 您可以通过variables: POSTGRES_DB: postgres POSTGRES_USER: postgres secrets: POSTGRES_PASSWORD: POSTGRES_PASSWORD 上的服务发现来访问数据库端点-您可能需要更新连接到数据库的服务代码以反映该端点,而不是db.$COPILOT_SERVICE_DISCOVERY_ENDPOINT或0.0.0.0。