E2E job 日志: pull access denied for minio/minio, repository does not exist 问题不在 tag 本身,而在**整个仓库已从 Docker Hub 移除**:MinIO 自 2025-10 起停止 发布容器镜像(改为仅源码分发),其 GitHub 仓库于 2026-02 归档,Docker Hub 上 minio/minio 与 minio/mc 现均返回 404;quay.io/minio/minio 仍在提供镜像。 本机此前是用 quay.io 的镜像重打 tag 顶替才跑通的(见 known-risks KR-01), 但那只是**本地绕过**、没有同步回仓库,于是「本地能起栈、CI 拉不到」。 现在三处 compose(本地 / staging / prod)统一改为 quay.io, 让本地、CI 与生产拉取同一个镜像。 这不只是 CI 问题:prod 与 staging 同样引用了已下架的仓库,是真实的部署阻塞 —— 也就是说现有配置下,新环境的生产部署根本起不来。 已知偏离:使用 latest 而非钉版。本机无法访问 quay 的 tag API 去核实某个具体 RELEASE tag 是否仍存在(quay 上的镜像已冻结,最后发布为 2025-09)。 e2e job 新增一步打印实际拉取到的版本,日后即可据此钉版、恢复可复现性。 长期风险:quay 上的 MinIO 镜像同样可能下架,届时需自建镜像或迁移到其他 S3 兼容存储 —— 「依赖第三方镜像」本身就是一条外部依赖风险。 上一轮修复已见效:backend / admin-web / ui-contracts / miniapp / test-shell-guard / migration 六个 job 均通过,本轮仅剩 E2E。
148 lines
5.7 KiB
YAML
148 lines
5.7 KiB
YAML
# 丹阳公益婚恋服务平台 - 本地完整环境
|
||
|
||
services:
|
||
postgres:
|
||
image: postgres:16-alpine
|
||
container_name: danyang-match-postgres
|
||
environment:
|
||
POSTGRES_DB: danyang_match
|
||
POSTGRES_USER: postgres
|
||
POSTGRES_PASSWORD: ${DB_PASSWORD:?请在本地 .env 设置 DB_PASSWORD}
|
||
ports:
|
||
- "5434:5432"
|
||
volumes:
|
||
- postgres_data:/var/lib/postgresql/data
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U postgres -d danyang_match"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 5
|
||
|
||
redis:
|
||
image: redis:7-alpine
|
||
container_name: danyang-match-redis
|
||
ports:
|
||
- "6381:6379"
|
||
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:?请在本地 .env 设置 REDIS_PASSWORD}
|
||
volumes:
|
||
- redis_data:/data
|
||
healthcheck:
|
||
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD:?请在本地 .env 设置 REDIS_PASSWORD}", "ping"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 5
|
||
|
||
minio:
|
||
# 2026-09-22 修正:镜像源从 Docker Hub 迁到 quay.io。
|
||
#
|
||
# 原 `minio/minio:RELEASE.2025-09-07T16-13-09Z` 在 CI 上根本拉不到,Actions 报:
|
||
# pull access denied for minio/minio, repository does not exist
|
||
# 问题不在 tag,而在**整个仓库已从 Docker Hub 移除**:MinIO 自 2025-10 起停止发布
|
||
# 容器镜像(改为仅源码分发),其 GitHub 仓库于 2026-02 归档;Docker Hub 上
|
||
# minio/minio 与 minio/mc 现均返回 404。quay.io/minio/minio 仍在提供镜像。
|
||
#
|
||
# 本机此前正是用 quay.io 的镜像重打 tag 顶替才跑通的(见 known-risks KR-01),
|
||
# 但那只是**本地绕过**、没有同步回仓库,于是「本地能起栈、CI 拉不到」。
|
||
# 现在统一改为 quay.io,让本地与 CI 拉同一个镜像,消除这处不一致。
|
||
#
|
||
# 已知偏离:此处用 latest 而非钉版。原因是本机访问不到 quay.io 的 tag API,
|
||
# 无法核实某个具体 RELEASE tag 是否仍然存在(quay 上的镜像已冻结,
|
||
# 最后发布为 2025-09)。latest 已被多个下游项目实测可用;e2e job 会打印
|
||
# 实际拉取到的版本,供日后补钉版。
|
||
# 长期风险:quay 上的 MinIO 镜像同样可能下架,届时需自建镜像或迁移到其他
|
||
# S3 兼容存储 —— 这也意味着「依赖第三方镜像」本身就是一条外部依赖风险。
|
||
image: quay.io/minio/minio:latest
|
||
container_name: danyang-match-minio
|
||
command: server /data --console-address ":9001"
|
||
environment:
|
||
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:?请在本地 .env 设置 MINIO_ACCESS_KEY}
|
||
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:?请在本地 .env 设置 MINIO_SECRET_KEY}
|
||
ports:
|
||
- "9003:9000"
|
||
- "9004:9001"
|
||
volumes:
|
||
- minio_data:/data
|
||
healthcheck:
|
||
test: ["CMD", "mc", "ready", "local"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 5
|
||
|
||
backend:
|
||
build:
|
||
context: ../backend
|
||
dockerfile: Dockerfile
|
||
container_name: danyang-match-backend
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
redis:
|
||
condition: service_healthy
|
||
minio:
|
||
condition: service_healthy
|
||
environment:
|
||
SPRING_PROFILES_ACTIVE: docker
|
||
DB_HOST: postgres
|
||
DB_PORT: 5432
|
||
DB_NAME: danyang_match
|
||
DB_USER: postgres
|
||
DB_PASSWORD: ${DB_PASSWORD:?请在本地 .env 设置 DB_PASSWORD}
|
||
REDIS_HOST: redis
|
||
REDIS_PORT: 6379
|
||
REDIS_PASSWORD: ${REDIS_PASSWORD:?请在本地 .env 设置 REDIS_PASSWORD}
|
||
MINIO_ENDPOINT: http://minio:9000
|
||
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:?请在本地 .env 设置 MINIO_ACCESS_KEY}
|
||
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?请在本地 .env 设置 MINIO_SECRET_KEY}
|
||
JWT_ACCESS_SECRET: ${JWT_ACCESS_SECRET:?请在本地 .env 设置 JWT_ACCESS_SECRET}
|
||
JWT_REFRESH_SECRET: ${JWT_REFRESH_SECRET:?请在本地 .env 设置 JWT_REFRESH_SECRET}
|
||
ENCRYPTION_KEY: ${ENCRYPTION_KEY:?请在本地 .env 设置 ENCRYPTION_KEY}
|
||
WECHAT_APP_ID: dev-wechat-app-id
|
||
WECHAT_APP_SECRET: ${WECHAT_APP_SECRET:-}
|
||
ports:
|
||
- "8085:8080"
|
||
healthcheck:
|
||
# 与 nginx 同理,用 127.0.0.1 而非 localhost:backend 当前恰好双栈监听(:::8080),
|
||
# 故 localhost 解析成 ::1 也能通;但探针不应依赖「服务恰好绑了 IPv6」这一偶然事实。
|
||
test: ["CMD-SHELL", "wget -qO /dev/null http://127.0.0.1:8080/api/v1/health/live || exit 1"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 3
|
||
|
||
admin-web:
|
||
build:
|
||
context: ../admin-web
|
||
dockerfile: Dockerfile
|
||
container_name: danyang-match-admin
|
||
depends_on:
|
||
backend:
|
||
condition: service_healthy
|
||
|
||
nginx:
|
||
image: nginx:alpine
|
||
container_name: danyang-match-nginx
|
||
depends_on:
|
||
backend:
|
||
condition: service_healthy
|
||
admin-web:
|
||
condition: service_started
|
||
ports:
|
||
- "6688:80"
|
||
volumes:
|
||
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||
healthcheck:
|
||
# 探针地址必须写 127.0.0.1,不能写 localhost。
|
||
# 实测:nginx 的 `listen 80` 只绑 IPv4(容器内 netstat = 0.0.0.0:80),
|
||
# 而 /etc/hosts 中 `::1 localhost` 同样存在,busybox wget 解析 localhost 时优先取 ::1
|
||
# → 探针连 IPv6 回环被拒(Connection refused)→ 容器被标 unhealthy,
|
||
# 但服务其实完全正常(宿主 curl http://localhost:6688/nginx-health = 200)。
|
||
# 这是一类「探针与被探对象脱钩」的假告警,还会连带拖垮 depends_on: service_healthy。
|
||
test: ["CMD-SHELL", "wget -qO /dev/null http://127.0.0.1/nginx-health || exit 1"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 3
|
||
|
||
volumes:
|
||
postgres_data:
|
||
redis_data:
|
||
minio_data:
|