
在容器化部署中,如何安全、穩定地「拉取私有映像檔」是常見需求,本文精簡說明兩件事:
TL;DR
- Docker:先用 Deploy Token
docker login
,再docker pull
- Kubernetes:建立
docker-registry
類型的 Secret,於imagePullSecrets
引用
進到專案 → Settings → Repository → Deploy tokens
勾選你需要的權限:
P.S. 如果你有 Group 權限,也可以申請一個 Group Access Token,這樣就能跨專案拉取images
記下 GitLab 給的 username / password。
# 清除舊認證(可選) docker logout registry.abc.com # 使用 Deploy Token 登入(建議用 --password-stdin) echo "<deploy_token_password>" | docker login registry.abc.com -u <deploy_token_username> --password-stdin # 拉取測試 docker pull registry.abc.com/kong/kong-api-gateway/main:70368
為什麼建議使用 --password-stdin
?
~/.bash_history
、PowerShell 歷史)。ps
、Windows Get-CimInstance Win32_Process
會看得到參數)。--password
明文參數;使用標準輸入更安全且可審計。範例(更安全的一次性輸入):
# Bash / Linux / macOS:建議用 printf 避免 echo 行為差異 printf "%s" "$DEPLOY_TOKEN" | docker login registry.abc.com -u "$DEPLOY_USER" --password-stdin
# Windows PowerShell $Env:DEPLOY_TOKEN | docker login registry.abc.com -u $Env:DEPLOY_USER --password-stdin
若你的 Registry 沒有 HTTPS,需在 Docker Daemon 設定 insecure-registries
:
# 編輯 Docker daemon 配置 sudo nano /etc/docker/daemon.json # 加入以下內容 { "insecure-registries": ["registry.abc.com:5000", "192.168.1.100:5000"] } # 重啟 Docker 服務 sudo systemctl restart docker # 或者重啟 Docker Desktop (Windows/Mac)
注意事項:
在要部署的命名空間建立一個 docker-registry
類型的 Secret:
# 建立 Docker Registry Secret kubectl create secret docker-registry kong-api-gateway-secret \ --docker-server=registry.abc.com \ --docker-username=<deploy_token_username> \ --docker-password=<deploy_token_password> \ --docker-email=none \ -n <your-namespace>
apiVersion: apps/v1 kind: Deployment metadata: name: kong-api-gateway spec: replicas: 1 selector: matchLabels: app: kong-api-gateway template: metadata: labels: app: kong-api-gateway spec: containers: - name: kong image: registry.abc.com/kong/kong-api-gateway/main:70368 ports: - containerPort: 8000 imagePullSecrets: - name: kong-api-gateway-secret
# 檢查 Secret 是否建立成功(命名空間必須正確) kubectl get secret kong-api-gateway-secret -n <your-namespace> -o yaml # 重新建立 Secret kubectl delete secret kong-api-gateway-secret -n <your-namespace> kubectl create secret docker-registry kong-api-gateway-secret \ --docker-server=registry.abc.com \ --docker-username=<deploy_token_username> \ --docker-password=<deploy_token_password> \ --docker-email=none \ -n <your-namespace>
補充
# 檢查 Secret 是否存在於指定命名空間 kubectl get secret kong-api-gateway-secret -n <your-namespace> # 將 Secret 掛到該命名空間的 default ServiceAccount kubectl patch serviceaccount default -n <your-namespace> -p '{"imagePullSecrets":[{"name":"kong-api-gateway-secret"}]}'
可以幫你把這段再精簡成更好懂的「安全金鑰使用說明」,保留重點但去掉技術贅字:
在 GitLab 使用金鑰或密碼時,要注意以下幾點,避免外洩:
[MASKED]
,不會顯示真實內容。適合 SSH 私鑰、Kubeconfig、JSON 憑證等。
範例:
chmod 600 "$SSH_PRIVATE_KEY" GIT_SSH_COMMAND="ssh -i $SSH_PRIVATE_KEY -o StrictHostKeyChecking=no" \ git ls-remote [email protected]:group/project.git
set -x
。範例:
printf "%s" "$DEPLOY_TOKEN" | docker login registry.abc.com -u "$DEPLOY_USER" --password-stdin
read_registry
就好)。--password-stdin
:避免密碼出現在命令列。unset
,刪除暫存檔,Runner 啟用清理,K8s 啟用 Secret 加密。docker login -p
、Dockerfile、YAML、.env 檔裡。