使用容器进行Python开发

先决条件

完成 Python 应用程序的容器化

概述

在本部分中,您将了解如何为容器化应用程序设置开发环境。这包括:

  • 添加本地数据库并持久化数据
  • 配置 Compose 以在您编辑和保存代码时自动更新正在运行的 Compose 服务

获取示例应用程序

您需要克隆一个新的存储库来获取包含连接到数据库的逻辑的示例应用程序。

  1. 更改到要克隆存储库的目录并运行以下命令。

    $ git clone https://github.com/docker/python-docker-dev
    
  2. 在克隆存储库的目录中,运行docker init以创建必要的 Docker 文件。请参阅以下示例来回答 中的提示docker init

    $ docker init
    Welcome to the Docker Init CLI!
    
    This utility will walk you through creating the following files with sensible defaults for your project:
      - .dockerignore
      - Dockerfile
      - compose.yaml
      - README.Docker.md
    
    Let's get started!
    
    ? What application platform does your project use? Python
    ? What version of Python do you want to use? 3.11.4
    ? What port do you want your app to listen on? 5000
    ? What is the command to run your app? python3 -m flask run --host=0.0.0.0
    

添加本地数据库并持久化数据

您可以使用容器来设置本地服务,例如数据库。在本部分中,您将更新compose.yaml文件以定义数据库服务和用于保存数据的卷。

在克隆存储库的目录中,compose.yaml在 IDE 或文本编辑器中打开文件。docker init处理了大部分指令的创建,但您需要针对您独特的应用程序对其进行更新。

在该compose.yaml文件中,您需要取消注释所有数据库指令。另外,您需要将数据库密码文件作为环境变量添加到服务器服务中,并指定要使用的秘密文件。

以下是更新后的compose.yaml文件。

services:
  server:
    build:
      context: .
    ports:
      - 5000:5000
    environment:
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    depends_on:
      db:
        condition: service_healthy
    secrets:
      - db-password
  db:
    image: postgres
    restart: always
    user: postgres
    secrets:
      - db-password
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=example
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    expose:
      - 5432
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
volumes:
  db-data:
secrets:
  db-password:
    file: db/password.txt

笔记

要了解有关 Compose 文件中的说明的更多信息,请参阅 Compose 文件参考

在使用 Compose 运行应用程序之前,请注意此 Compose 文件指定了一个password.txt文件来保存数据库的密码。您必须创建此文件,因为它不包含在源存储库中。

在克隆存储库的目录中,创建一个名为 的新目录db,并在该目录内创建一个名为 的文件password.txt,其中包含数据库的密码。使用您喜欢的 IDE 或文本编辑器,将以下内容添加到password.txt文件中。

mysecretpassword

保存并关闭password.txt文件。

您的目录中现在应该有以下内容python-docker-dev

├── python-docker-dev/
│ ├── db/
│ │ └── password.txt
│ ├── app.py
│ ├── requirements.txt
│ ├── .dockerignore
│ ├── compose.yaml
│ ├── Dockerfile
│ ├── README.Docker.md
│ └── README.md

现在,运行以下docker compose up命令来启动您的应用程序。

$ docker compose up --build

现在测试您的 API 端点。打开一个新终端,然后使用curl命令向服务器发出请求:

$ curl http://localhost:5000/initdb
$ curl http://localhost:5000/widgets

您应该收到以下回复:

[]

响应为空,因为您的数据库为空。

ctrl+c终端停止您的应用程序。

自动更新服务

使用 Compose Watch 在您编辑和保存代码时自动更新正在运行的 Compose 服务。有关 Compose Watch 的更多详细信息,请参阅 使用 Compose Watch

compose.yaml在 IDE 或文本编辑器中打开文件,然后添加 Compose Watch 指令。以下是更新后的compose.yaml文件。

services:
  server:
    build:
      context: .
    ports:
      - 5000:5000
    environment:
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    depends_on:
      db:
        condition: service_healthy
    secrets:
      - db-password
    develop:
      watch:
        - action: rebuild
          path: .
  db:
    image: postgres
    restart: always
    user: postgres
    secrets:
      - db-password
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=example
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    expose:
      - 5432
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
volumes:
  db-data:
secrets:
  db-password:
    file: db/password.txt

运行以下命令以使用 Compose Watch 运行您的应用程序。

$ docker compose watch

在终端中,curl 应用程序以获得响应。

$ curl http://localhost:5000
Hello, Docker!

对本地计算机上应用程序源文件的任何更改现在都将立即反映在正在运行的容器中。

python-docker-dev/app.py在 IDE 或文本编辑器中打开并Hello, Docker!通过添加几个感叹号来更新字符串。

-    return 'Hello, Docker!'
+    return 'Hello, Docker!!!'

保存更改app.py,然后等待几秒钟以重建应用程序。再次卷曲应用程序并验证是否显示更新的文本。

$ curl http://localhost:5000
Hello, Docker!!!

ctrl+c终端停止您的应用程序。

概括

在本部分中,您了解了如何设置 Compose 文件以添加本地数据库并保留数据。您还了解了如何在更新代码时使用 Compose Watch 自动重建和运行容器。

相关信息:

下一步

在下一节中,您将了解如何使用 GitHub Actions 设置 CI/CD 管道。