Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

System 示例:纯 docker-compose 系统

纯 compose 系统不组合模块、不使用 GXL 工作流,gops sys 直接驱动本机 docker compose。

1. 创建系统

gops sys new --name gateway --kind docker-compose
cd gateway

生成的是精简结构(无 _gal/、mod_list.yml、workflows/、setting/list.yml),见 目录结构。

sys/sys_model.yml:

name: gateway
kind: docker-compose
vender: ''

2. 编写 compose 与变量定义

sys/docker-compose.yaml 用 Docker Compose 原生 ${VAR} 占位(sys new 会生成一份可修改的模板):

services:
  app:
    image: ${SERVICE_IMAGE}
    ports:
      - "${SERVICE_PORT}:80"
    deploy:
      replicas: ${REPLICAS}

compose 文件默认位于 sys/,也兼容放在系统根(旧布局)。无论文件在哪,compose 项目目录都锚定系统根,${VAR} 由系统根的 .env 注入。

非密钥变量在 sys/setting/vars.yml 的 system: 段声明(源定义,随系统版本化):

system:
  - name: SERVICE_IMAGE
    value: nginx:alpine
  - name: SERVICE_PORT
    value: 8080
  - name: REPLICAS
    value: 1

密钥不要写在这里:在 compose 里用 ${SEC_xxx} 占位,运行时由 gops run start 从 ~/.galaxy/sec_value.yml(或当前目录 ./.galaxy/sec_value.yml)注入(不落盘)。

services:
  db:
    environment:
      POSTGRES_PASSWORD: ${SEC_POSTGRES_PASSWORD}

~/.galaxy/sec_value.yml(不在项目里、不入库):

postgres_password: "your-secret"

key 会归一化为大写并加 SEC_ 前缀:postgres_password → SEC_POSTGRES_PASSWORD。

3. 生成 .env

gops sys localize        # 默认先解析变量(等价于先 update),再生成 .env
cat .env

规则:

.env = sys/merged_vars.yml 默认值 ⊕ values/sys_value.yml ⊕ values/value.yml
  • values/sys_value.yml 是 sys update 生成的注释模板:取消注释要覆盖的项即可,其余取默认值。
  • values/value.yml 是更高优先级的覆盖层。

例如只想改端口与副本数:

# values/sys_value.yml
SERVICE_PORT: 9090
REPLICAS: 3

.env 只包含非密钥配置,随时可以用 docker compose config 校验。

4. 部署

kind: docker-compose 下,部署命令映射到 docker compose:

gops run diagnose    # docker compose config(密钥以 ******** 掩码注入)
gops run download    # docker compose pull
gops run install     # docker compose create
gops run start       # docker compose up -d(密钥注入子进程环境)
gops run status      # docker compose ps
gops run stop        # docker compose stop
gops run uninstall   # docker compose down

kind: docker-compose 下 --mod 参数会被忽略(没有模块概念);--env 仍可传入。

5. 交付给客户(运维项目)

gops sys package                          # 先 update 再打包 -> ../gateway-<version>.tar.gz
cd ..
gops prj new --name customer-a
cd customer-a
gops prj import --path ../gateway-0.1.0.tar.gz
cd gateway
gops sys localize                         # 使用 <project>/values/gateway/ 下的客户值
gops run start

客户差异写在 <project>/values/gateway/(例如 value.yml)。在项目内的系统目录执行 gops sys localize / sys update 时,会依据上层 ops-prj.yml 直接使用该项目值目录。