我可以使用此 CI/CD 配置構建、推送(到 gitlab 注冊表)并部署映像(到 aws EC2)嗎?
stages:
- build
- deploy
build:
# Use the official docker image.
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
# Default branch leaves tag empty (= latest tag)
# All other branches are tagged with the escaped branch name (commit ref slug)
script:
- |
if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
tag=""
echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'"
else
tag=":$CI_COMMIT_REF_SLUG"
echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag"
fi
- docker build --pull -t "$CI_REGISTRY_IMAGE${tag}" .
- docker push "$CI_REGISTRY_IMAGE${tag}"
# Run this job in a branch where a Dockerfile exists
deploy:
stage: deploy
before_script:
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
script:
- ssh -o StrictHostKeyChecking=no [email protected] "sudo docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY; sudo docker pull $CI_REGISTRY_IMAGE${tag}; cd /home/crud_app; sudo docker-compose up -d"
after_script:
- sudo docker logout
rules:
- if: $CI_COMMIT_BRANCH
exists:
- Dockerfile
腳本構建成功后,部署失敗。
(構建成功)

(部署失敗)

配置必須是構建和部署鏡像
uj5u.com熱心網友回復:
有幾個錯誤,但整體流水線看起來不錯。
- 如果沒有
ssh-add運行代理,您將無法使用 - 如果之后您明確忽略將存盤在 .ssh 下的密鑰,為什么還要手動創建 .ssh 檔案夾
known_hosts? - 使用
StrictHostKeyChecking=no是危險的,完全不推薦。
在before_script添加以下內容:
before_script:
- eval `ssh-agent`
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- ssh-keyscan -H 18.0.0.82 >> ~/.ssh/known_hosts
另外,不要sudo在您的ubuntu用戶上使用,最好將其添加到docker組中或通過 SSH 連接到組中的用戶docker。
如果您docker的 EC2 實體中還沒有組,現在是配置它的好時機:
訪問您的 EC2 實體并創建docker組:
$ sudo groupadd docker
將ubuntu用戶添加到docker組:
$ sudo usermod -aG docker ubuntu
現在將您更改script為:
script:
- echo $CI_REGISTRY_PASSWORD > docker_password
- scp docker_password [email protected]:~/tmp/docker_password
- ssh [email protected] "cat ~/tmp/docker_password | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY; docker pull $CI_REGISTRY_IMAGE${tag}; cd /home/crud_app; docker-compose up -d; docker logout; rm -f ~/tmp/docker_password"
另外,請記住,after_script您不在 EC2 實體中,而是在運行器映像中,因此您不需要這樣做logout,但是最好殺死 SSH 代理。
最后的作業
deploy:
stage: deploy
before_script:
- eval `ssh-agent`
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- ssh-keyscan -H 18.0.0.82 >> ~/.ssh/known_hosts
script:
- echo $CI_REGISTRY_PASSWORD > docker_password
- scp docker_password [email protected]:~/tmp/docker_password
- ssh [email protected] "cat ~/tmp/docker_password | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY; docker pull $CI_REGISTRY_IMAGE${tag}; cd /home/crud_app; docker-compose up -d; docker logout; rm -f ~/tmp/docker_password"
after_script:
- kill $SSH_AGENT_PID
- rm docker_password
rules:
- if: $CI_COMMIT_BRANCH
exists:
- Dockerfile
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/331728.html
標籤:码头工人 亚马逊-ec2 docker-compose GitLab 西德
