Django的AWS副驾驶从未完成部署



我已经按照这个简短的指南创建了一个带有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. 

tl;dr本教程使用的Dockerfile对于Copilot来说是不完整的它需要一条包含的额外线路

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

并且CCD_ 3指令应当被更新为8000。由于Copilot无法识别Docker Compose语法,并且Dockerfile中没有指定命令或入口点,因此图像永远不会从Copilot的配置设置开始。

详细信息

AWS Copilot是围绕";服务";由图像、可能的侧车和额外的存储资源组成。这意味着它的基本配置单元是Docker映像和服务清单。它本身并不读取Docker Compose语法,因此Copilot所知道的所有配置都是在Dockerfile或映像以及每个服务的manifest.ymladdons目录中指定的配置。

在这个设计用于Docker Compose的示例中,Dockerfile没有任何类型的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部分中指定的命令作为CMD指令添加到Dockerfile中。

您还需要运行

copilot init --image postgres --name db --port 5432 --type "Backend Service" --deploy

这将创建docker-compose.yml中指定的数据库服务。您可能需要先运行此操作,这样您的web容器在搜索凭据时就不会启动失败。

其他注意事项:

  • 您可以通过在./copilot/db/manifest.yml的工作区中创建的db的清单文件中添加variablessecrets来指定数据库凭据。有关如何向SSM添加机密并使其可供您的Copilot服务访问的更多信息,请查看我们的文档
variables: 
POSTGRES_DB: postgres
POSTGRES_USER: postgres
secrets:
POSTGRES_PASSWORD: POSTGRES_PASSWORD
  • 您的数据库端点可以通过db.$COPILOT_SERVICE_DISCOVERY_ENDPOINT的服务发现访问——您可能需要更新连接到数据库的服务代码,以反映该端点,而不是localhost或0.0.0.0

最新更新