我遵循了这个简短指南,使用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.
答案 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.yml
和addons
目录中指定的配置。
在此示例中,该Dockerfile设计用于Docker Compose,没有任何CMD
或ENTRYPOINT
指令,因此由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
的清单文件中添加secrets
和db
来指定数据库凭据。有关如何向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。