Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。使用一个命令,就可以从 YML 文件配置中创建并启动所有服务

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose. yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
# yaml 配置实例
version: '3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

https://www.runoob.com/docker/docker-compose.html

docker-compose. yaml 和 config. yaml

读取环境变量

docker-compose.yml 中设置的 environment

environment:
  - DB_HOST=localhost
  - DB_PORT=5432
  - API_KEY=abc123

这些是 操作系统级别的环境变量(Environment Variables),你的 Go 程序必须通过 os.Getenv() 或类似方式读取。

package main
import (
    "fmt"
    "os"
)
func main() {
    dbHost := os.Getenv("DB_HOST")     // 从 environment 读取
    dbPort := os.Getenv("DB_PORT")
    apiKey := os.Getenv("API_KEY")
    fmt.Printf("DB: %s:%s\n", dbHost, dbPort)
}

环境变量覆盖配置文件

优先级 来源 说明
1️⃣ 最高 环境变量(Environment Variables) Docker、K8s、CI/CD 常用
2️⃣ 中等 config.yaml  文件 本地开发、默认值
3️⃣ 最低 硬编码默认值 防止崩溃

使用  viper  库

import "github.com/spf13/viper"
func init() {
    viper.SetConfigName("config")
    viper.SetConfigType("yaml")
    viper.AddConfigPath("config")
    // 允许环境变量覆盖
    viper.AutomaticEnv()
    viper.ReadInConfig()
}

然后你就可以:

  • 在  config.yaml  写:
database:
  host: localhost
  port: 5432
  • 在  docker-compose.yml  写:
environment:
  - DATABASE_HOST=prod-db.example.com
  - DATABASE_PORT=6432
  • viper.GetString("database.host")  会自动优先返回环境变量

基目录

Docker Compose 是以 项目(project)为单位 管理容器的。

默认项目名 = 所在目录的 basename(即文件夹名字)。

okx/
├── signal/
│   └── test/          ← basename = "test"
│       └── docker-compose.yaml  # 只定义 signal
└── market/
    └── test/          ← basename = "test"
        └── docker-compose.yaml  # 只定义 market

虽然物理路径不同,但两个目录的 basename 都是 test

所以:

  • 在  signal/test  执行  docker compose up → 项目名 = test
  • 在  market/test  执行  docker compose up → 项目名 = test

Docker Compose 认为这是同一个项目

所以应该指定不同的 basename