Docker 使用 AWS Lightstail 容器的 Compose 和 Django 应用程序部署失败

Docker Compose and Django app using AWS Lighstail containers fail to deploy

我正在尝试在最新版本的 Lightsail 上获取 Django 应用程序 运行ning,它支持从 2020 年 11 月开始部署 docker 个容器 (AWS Lightsail Container Announcement)。

我创建了一个非常小的 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

我想知道一些事情:

  1. 现在我只将 web 容器上传到 Lightsail。我还应该上传 db 容器吗?
  2. 我应该先在 Lightsail 中创建一个 postgres 数据库并连接到它吗?
  3. 我是否需要在应用程序启动前告诉 Django 运行 数据库迁移?
  4. 有没有办法从容器中启用更多日志?或者缺少日志是否意味着容器甚至无法启动。

感谢您的帮助!

Docker

这个问题源于对Docker的错误理解。我之前试图在我的 docker-compose.yml 中包含 image: argylehacker/app-stats:latest 以将 web 容器上传到 DockerHub。这是错误的处理方式。据我现在的了解,docker-compose 最有助于协调您的本地环境,而不是创建 docker 可以在容器中 运行 的图像。

最重要的是上传一个容器到Lightsail,可以启动你的服务器。当您使用 Docker 时,可以使用 CMDDockerfile 的末尾指定。在我的例子中,我需要将这一行添加到我的 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", "manage.py", "runserver", "2.0.0.0:8000"]

最后,我从 docker-compose.yml 文件中删除了 image: argylehacker/app-stats:latest 行。

此时你应该能够:

  1. 构建你的容器docker build -t argylehacker/app-stats:latest .
  2. 上传到 DockerHub docker push argylehacker/app-stats:latest
  3. 在指向 argylehacker/app-stats:latest
  4. 的 AWS Lightsail 中部署它

疑难解答

我卡住了,因为我在 Lightsail 日志终端中看不到任何有意义的日志。这是因为我的容器实际上 运行 没有任何东西。

为了在本地进行调试,我采取了以下步骤

  1. 构建图像docker build -t argylehacker/app-stats:latest .
  2. 运行 容器 docker run -it --rm -p 8000:8000 argylehacker/app-stats:latest.

此时docker应该运行正在连接容器,您可以查看日志。当它 运行 是您的容器时,这正是 Lightsail 要做的事情。

我原来问题的答案

  1. Dockerfil 与用于组合服务的 docker-compose 文件非常不同。 docker-compose 的目的是协调容器,而 Docker 文件将定义图像的构建方式。您需要为 Lightsail 做的就是构建图像 docker build <container>:<tag>
  2. 是的,您需要在 AWS Lightsail 中创建一个 Postgres 数据库,以便 Django 可以连接到数据库和 运行。一旦数据库凭据在 Lightsail 中可用,您将修改 settings.py 文件以包含数据库凭据。
  3. 仍在寻找 运行 数据库迁移
  4. 的最佳方法
  5. 缺少日志是因为Docker文件没有启动 Django