首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Django的AWS copilot永远不会完成部署

使用Django的AWS copilot永远不会完成部署
EN

Stack Overflow用户
提问于 2020-11-01 07:48:24
回答 1查看 414关注 0票数 3

我已经按照这篇简短的指南使用docker https://docs.docker.com/compose/django/创建了一个django应用程序

然后按照copilot指令将容器向上推送到ECS:https://aws.amazon.com/blogs/containers/introducing-aws-copilot/

我还使用这个示例测试了所有东西--结果很好:https://github.com/aws-samples/aws-copilot-sample-service部署完成和输出,以及URL端点。

在我的例子中,一切都是成功构建的,但一旦部署了测试环境,它就会持续构建:

代码语言:javascript
复制
72ff4719 size: 3055
⠏ Deploying load-bal:7158348 to test.

而且永远不会结束。我甚至把我的requirements.txt缩小到了最小尺寸。

我的Dockerfile

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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参与的情况下进行copilot教学。

代码语言:javascript
复制
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. 
EN

回答 1

Stack Overflow用户

发布于 2020-11-11 02:42:08

tl;dr本教程使用的Dockerfile文件对于Copilot而言是不完整的。它需要额外的一行,其中包含

代码语言:javascript
复制
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

并且EXPOSE指令应该更新到8000。因为Copilot不识别Docker Compose语法,并且Dockerfile中没有指定命令或入口点,所以镜像永远不会使用Copilot的配置设置启动。

详细信息

AWS Copilot围绕由镜像、可能的侧车和额外的存储资源组成的“服务”而设计。这意味着它的基本配置单元是Docker镜像和服务清单。它本身并不读取Docker编写语法,所以Copilot所知道的所有配置都是在Docker文件或镜像以及每个服务的manifest.ymladdons目录中指定的。

在这个示例中,Dockerfile没有任何类型的CMDENTRYPOINT指令,因此由Copilot推送到Amazon ECR的构建镜像将永远不会启动。本教程将镜像的命令(python manage.py runserver 0.0.0.0:8000)指定为docker-compose.yml中的覆盖,因此您需要将Dockerfile文件更新为以下内容:

代码语言:javascript
复制
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中。

您还需要运行

代码语言:javascript
复制
copilot init --image postgres --name db --port 5432 --type "Backend Service" --deploy

这将创建在docker-compose.yml中指定的db服务。您可能需要先运行此程序,以便您的web容器在搜索凭据时不会无法启动。

其他一些注意事项:

  • 您可以通过在./copilot/db/manifest.yml工作区中创建的db清单文件中添加variablessecrets来指定您的数据库凭据。有关如何将密钥添加到SSM并使其可供您的Copilot服务访问的更多信息,请访问check out our documentation

代码语言:javascript
复制
variables: 
  POSTGRES_DB: postgres
  POSTGRES_USER: postgres

secrets:
  POSTGRES_PASSWORD: POSTGRES_PASSWORD

  • 您的数据库端点可通过db.$COPILOT_SERVICE_DISCOVERY_ENDPOINT上的服务发现进行访问--您可能需要更新连接到数据库的服务代码,以反映此端点,而不是localhost或0.0.0.0。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64627462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档