docker Compose 示例1
Docker Compose 是一个用于定义和运行多容器应用程序的工具。它是解锁精简高效的开发和部署体验的关键。
Compose 简化了整个应用程序堆栈的控制,让您可以轻松地在一个易于理解的 YAML 配置文件中管理服务、网络和卷。然后,您只需一个命令即可从配置文件中创建并启动所有服务。
官网:
docker-compose.yml配置文件
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"
version: "3"指定 Docker Compose 文件的版本。
版本 3 是 Docker Compose 的一个稳定版本,适用于大多数场景。
2. services:
services:定义了一个名为
app的服务。每个服务都会启动一个容器,您可以在其中运行应用程序。
3. build:
build:context: .指定构建上下文为当前目录,即 Docker Compose 会在当前目录查找 Dockerfile 进行构建。
args:DEV: "true"传递构建参数
DEV,值为"true",可在 Dockerfile 中使用ARG DEV进行条件判断。
4. image:
image:指定构建完成后生成的镜像名称和标签。
在此示例中,镜像名称为
my-fastapi-app,标签为2.0。
5. environment:
environment:设置环境变量
APP_PORT,值为8082,该变量可在应用程序中使用。可在
Dockerfile通过${APP_PORT}引用、默认值写法:${APP_PORT:-8080}如果环境变量是在
Dockerfile中是CMD用法时,需要shell语法来识别环境变量,见:dockerfile示例文件加载环境变量优先级:参考
6. ports:
ports:将容器的端口
8082映射到主机的端口8082,使得主机可以访问容器中的服务。
7. env_file:
env_file:指定一个环境变量文件
.env,Docker Compose 会自动加载该文件中的变量到容器环境中。加载环境变量优先级:参考
8. command:
command:指定容器启动时执行的命令。
在此示例中,使用
/bin/sh -c来执行uvicorn启动 FastAPI 应用。注意:在 shell 中引用环境变量时,需要使用
$$来转义$,以避免在 Docker Compose 解析时被提前解析。主要是为了公用环境变量,采用shell语法来写,静态写法:
command: uvicorn main:app --reload --host 0.0.0.0 --port 8000command命令会替换
Dockerfile中CMD命令
9. volumes:
volumes:将当前目录的
app目录挂载到容器的/app目录,允许在主机和容器之间共享文件。
加载环境变量的优先级
根据Docker Compose环境变量优先级规则,我们可以总结出以下优先级公式(从高到低):
docker compose run --env VAR=value(直接赋值)docker compose run --env VAR(从主机环境继承)compose.yml中的environment:(直接赋值)compose.yml中的env_file:(直接赋值)compose.yml中的environment:(引用.env或主机环境)compose.yml中的env_file:(引用.env或主机环境)Docker镜像中的
ENV指令.env文件中的值(仅当被引用时)主机环境变量(仅当被引用时)
dockerfile-simple
Last updated
Was this helpful?