问题描述
我正在尝试让 Django 应用程序在最新版本的 Lightsail 上运行,该版本支持自 2020 年 11 月 (AWS Lightsail Container Announcement) 部署 docker 容器。
我创建了一个非常小的 Django 应用程序来测试这一点。但是,我的容器部署继续卡住并失败。
这是我的 Dockerfile:
FROM python:3
ENV PYTHONUNBUFFERED=1
workdir /code
copY requirements.txt /code/
RUN pip install -r requirements.txt
copY . /code/
这是我的 docker-compose.yml:
version: "3.9"
services:
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
image: argylehacker/app-stats:latest
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
我想知道一些事情:
- 现在我只是将
web
容器上传到 Lightsail。我还应该上传db
容器吗? - 我是否应该在 Lightsail 中创建一个 postgres 数据库并先连接到它?
- 我是否需要在应用程序启动之前告诉 Django 运行数据库迁移?
- 有没有办法从容器中启用更多日志?或者,缺少日志是否意味着容器甚至无法启动。
感谢您的帮助!
解决方法
码头工人
这个问题源于对Docker的不好理解。我之前尝试在我的 image: argylehacker/app-stats:latest
中包含 docker-compose.yml
以将 web
容器上传到 DockerHub。这是错误的处理方式。根据我现在的理解,docker-compose
对编排本地环境最有帮助,而不是创建可以在容器中运行的 docker 镜像。
最重要的是将容器上传到 Lightsail 以启动您的服务器。当您使用 Docker 时,可以使用 CMD
和 Dockerfile
的结尾来指定。就我而言,我需要将此行添加到我的 Dockerfile
:
CMD ["python","manage.py","runserver","0.0.0.0:8000"]
所以现在看起来像这样:
FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
CMD ["python","2.0.0.0:8000"]
最后,我从我的 image: argylehacker/app-stats:latest
文件中删除了 docker-compose.yml
行。
此时您应该能够:
- 构建您的容器
docker build -t argylehacker/app-stats:latest .
- 将其上传到 DockerHub
docker push argylehacker/app-stats:latest
- 将其部署在指向
argylehacker/app-stats:latest
的 AWS Lightsail 中
问题排查
我遇到了这个问题,因为我在 Lightsail 日志终端中看不到任何有意义的日志。这是因为我的容器实际上并没有运行任何东西。
为了在本地进行调试,我采取了以下步骤
- 构建映像
docker build -t argylehacker/app-stats:latest .
- 运行容器
docker run -it --rm -p 8000:8000 argylehacker/app-stats:latest
。
此时 docker 应该正在运行容器,您可以查看日志。这正是 Lightsail 在运行您的容器时要做的事情。
对我的原始问题的回答
- Dockerfil 与用于组合服务的 docker-compose 文件非常不同。 docker-compose 的目的是协调容器,而 Dockerfile 将定义图像的构建方式。您需要为 Lightsail 做的就是构建映像
docker build <container>:<tag>
- 是的,您需要在 AWS Lightsail 中创建 Postgres 数据库,以便 Django 可以连接到数据库并运行。一旦它在 Lightsail 中可用,您将修改
settings.py
文件以包含数据库凭据。 - 仍在寻找运行数据库迁移的最佳方式
- 缺少日志是因为 Dockerfile 没有启动 Django