docker Compose 示例1

Docker Compose 是一个用于定义和运行多容器应用程序的工具。它是解锁精简高效的开发和部署体验的关键。

Compose 简化了整个应用程序堆栈的控制,让您可以轻松地在一个易于理解的 YAML 配置文件中管理服务、网络和卷。然后,您只需一个命令即可从配置文件中创建并启动所有服务。

官网:

docker-compose.yml配置文件

version: "3"
services:
  app:
    build:
      context: . # 使用当前目录的 Dockerfile进行构建
      args:
        DEV: "true"
    image: my-fastapi-app:2.0  # 定义镜像名称和标签
    environment:
      - APP_PORT=8082  # 设置端口号
    ports:
      - "8082:8082"
    env_file: # 自动加载到Docker容器环境变量中
      - .env
    command: /bin/sh -c 'uvicorn main:app --reload --host 0.0.0.0 --port $$APP_PORT' #容器启动时执行的命令,并且会覆盖 Dockerfile 中的 CMD命令(不会执行)
    volumes:
      - ./app:/app

🔍 配置项说明

1. version: "3"

  • 指定 Docker Compose 文件的版本。

  • 版本 3 是 Docker Compose 的一个稳定版本,适用于大多数场景。

2. services:

  • 定义了一个名为 app 的服务。

  • 每个服务都会启动一个容器,您可以在其中运行应用程序。

3. build:

  • context: .

    • 指定构建上下文为当前目录,即 Docker Compose 会在当前目录查找 Dockerfile 进行构建。

  • args:

    • DEV: "true"

      • 传递构建参数 DEV,值为 "true",可在 Dockerfile 中使用 ARG DEV 进行条件判断。

4. image:

  • 指定构建完成后生成的镜像名称和标签。

  • 在此示例中,镜像名称为 my-fastapi-app,标签为 2.0

5. environment:

  • 设置环境变量 APP_PORT,值为 8082,该变量可在应用程序中使用。

  • 可在Dockerfile通过 ${APP_PORT} 引用、默认值写法:${APP_PORT:-8080}

  • 如果环境变量是在Dockerfile中是CMD用法时,需要shell语法来识别环境变量,见:dockerfile示例文件

  • 加载环境变量优先级:参考

6. ports:

  • 将容器的端口 8082 映射到主机的端口 8082,使得主机可以访问容器中的服务。

7. env_file:

  • 指定一个环境变量文件 .env,Docker Compose 会自动加载该文件中的变量到容器环境中。

  • 加载环境变量优先级:参考

8. command:

  • 指定容器启动时执行的命令。

  • 在此示例中,使用 /bin/sh -c 来执行 uvicorn 启动 FastAPI 应用。

  • 注意:在 shell 中引用环境变量时,需要使用 $$ 来转义 $,以避免在 Docker Compose 解析时被提前解析。

  • 主要是为了公用环境变量,采用shell语法来写,静态写法:command: uvicorn main:app --reload --host 0.0.0.0 --port 8000

  • command命令会替换DockerfileCMD命令

9. volumes:

  • 将当前目录的 app 目录挂载到容器的 /app 目录,允许在主机和容器之间共享文件。

加载环境变量的优先级

参考:docker compose 加载环境变量优先级

根据Docker Compose环境变量优先级规则,我们可以总结出以下优先级公式(从高到低):

  1. docker compose run --env VAR=value (直接赋值)

  2. docker compose run --env VAR (从主机环境继承)

  3. compose.yml中的environment: (直接赋值)

  4. compose.yml中的env_file: (直接赋值)

  5. compose.yml中的environment: (引用.env或主机环境)

  6. compose.yml中的env_file: (引用.env或主机环境)

  7. Docker镜像中的ENV指令

  8. .env文件中的值(仅当被引用时)

  9. 主机环境变量(仅当被引用时)

dockerfile-simple

Last updated

Was this helpful?