
在容器化部署中,如何安全、穩定地「拉取私有映像檔」是常見需求,本文精簡說明兩件事:
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 檔裡。