我已经按照这个简短的指南创建了一个带有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.yml
和addons
目录中指定的配置。
在这个设计用于Docker Compose的示例中,Dockerfile没有任何类型的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
部分中指定的命令作为CMD
指令添加到Dockerfile中。
您还需要运行
copilot init --image postgres --name db --port 5432 --type "Backend Service" --deploy
这将创建docker-compose.yml
中指定的数据库服务。您可能需要先运行此操作,这样您的web容器在搜索凭据时就不会启动失败。
其他注意事项:
- 您可以通过在
./copilot/db/manifest.yml
的工作区中创建的db
的清单文件中添加variables
和secrets
来指定数据库凭据。有关如何向SSM添加机密并使其可供您的Copilot服务访问的更多信息,请查看我们的文档
variables:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
secrets:
POSTGRES_PASSWORD: POSTGRES_PASSWORD
- 您的数据库端点可以通过
db.$COPILOT_SERVICE_DISCOVERY_ENDPOINT
的服务发现访问——您可能需要更新连接到数据库的服务代码,以反映该端点,而不是localhost
或0.0.0.0