50 lines
2.1 KiB
Bash
Executable File
50 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# =========================================================
|
||
# Arcticnewone 镜像构建与推送脚本(本地 / 部署服务器手动执行)
|
||
#
|
||
# 遵循团队部署规范:
|
||
# - 镜像推送到华为云 SWR,tag 固定为 latest
|
||
# - 单架构构建 linux/amd64(服务器主流架构;SWR 不支持 buildx 多架构 OCI manifest)
|
||
# - --provenance=false 禁用 SLSA 证明,避免额外 manifest 导致 SWR 解析失败
|
||
# - docker build + docker push 分步执行,与 SWR 兼容性更好
|
||
# - 登录凭据一律从环境变量读取,绝不写入仓库
|
||
#
|
||
# 使用前先设置环境变量(示例):
|
||
# export SWR_REGISTRY="swr.cn-north-4.myhuaweicloud.com"
|
||
# export SWR_NAMESPACE="virtheart"
|
||
# export SWR_USERNAME="<SWR 用户名>"
|
||
# export SWR_PASSWORD="<SWR 密码>"
|
||
# 然后执行:
|
||
# ./build-and-push.sh
|
||
# =========================================================
|
||
set -euo pipefail
|
||
|
||
# 必填环境变量校验(缺失即报错退出)
|
||
: "${SWR_REGISTRY:?请先设置环境变量 SWR_REGISTRY(例如 swr.cn-north-4.myhuaweicloud.com)}"
|
||
: "${SWR_NAMESPACE:?请先设置环境变量 SWR_NAMESPACE(例如 virtheart)}"
|
||
: "${SWR_USERNAME:?请先设置环境变量 SWR_USERNAME(SWR 登录用户名)}"
|
||
: "${SWR_PASSWORD:?请先设置环境变量 SWR_PASSWORD(SWR 登录密码)}"
|
||
|
||
IMAGE_NAME="arcticnewone"
|
||
IMAGE_TAG="latest"
|
||
FULL_IMAGE="${SWR_REGISTRY}/${SWR_NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG}"
|
||
|
||
# 前置检查:docker
|
||
if ! command -v docker >/dev/null 2>&1; then
|
||
echo "错误: 未找到 docker 命令,请先安装 Docker" >&2
|
||
exit 1
|
||
fi
|
||
|
||
# 1. 登录 SWR(凭据来自环境变量,不写入仓库)
|
||
echo ">>> [1/3] 登录 SWR: ${SWR_REGISTRY}"
|
||
echo "${SWR_PASSWORD}" | docker login "${SWR_REGISTRY}" -u "${SWR_USERNAME}" --password-stdin
|
||
|
||
# 2. 构建 linux/amd64 镜像(禁用 provenance,产物为单一 manifest)
|
||
echo ">>> [2/3] 构建镜像: ${FULL_IMAGE} (linux/amd64)"
|
||
docker build --platform linux/amd64 --provenance=false -t "${FULL_IMAGE}" .
|
||
|
||
# 3. 推送镜像
|
||
echo ">>> [3/3] 推送镜像: ${FULL_IMAGE}"
|
||
docker push "${FULL_IMAGE}"
|
||
echo ">>> 推送完成: ${FULL_IMAGE}"
|