linux - 如何使用 Travis CI 将多个 docker 容器部署到 gcloud?
问题描述
我无法通过 Travis-CI 访问我的 gcloud 计算引擎,因此我可以拥有 CI/CD 功能。
到目前为止,使用我当前的代码,我可以使用我的 git 存储库在 Travis CI 上启动 docker 容器以查看它们是否工作。
然后我可以让他们毫无问题地构建、标记和部署到谷歌云容器注册表。
但是,当我到达我想通过 ssh 进入我的计算实例以提取和运行我的容器的步骤时,我遇到了问题。
我尝试过使用,gcloud compute ssh --command
但遇到了 gcloud 未安装在我的实例上的问题。收到错误:
如果我尝试运行 gcloud 命令,它只会说 gcloud 丢失。
bash: gcloud: command not found
The command "gcloud compute ssh --quiet --project charged-formula-262616 --zone us-west1-b instance-1 --command="gcloud auth configure-docker "" failed and exited with 127 during.
我也尝试过下载 gcloud sdk 并再次运行 docker 配置,但我开始收到下面的错误。
bash
Error response from daemon: unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
Using default tag: latest
我可以使用 putty 作为另一个用户 ssh 进入它,以毫无问题地从存储库中提取并启动容器并存在 gcloud 命令。
我唯一能想到的是用于 ssh 的两个帐户不同,但是两个密钥都添加到实例中,我看不到在哪里可以控制它们的权限。我还为 travis ci 创建了一个服务帐户,并授予它与计算服务帐户相同的权限,但仍然没有骰子...
任何帮助或建议将不胜感激!
我的 travis 文件看起来像这样
sudo: required
language: generic
services:
- docker
env:
global:
- SHA=$(git rev-parse HEAD)
- CLOUDSDK_CORE_DISABLE_PROMPTS=1
cache:
directories:
- "$HOME/google-cloud-sdk/"
before_install:
- openssl aes-256-cbc -K $encrypted_0c35eebf403c_key -iv $encrypted_0c35eebf403c_iv
-in secrets.tar.enc -out secrets.tar -d
- tar xvf secrets.tar
- if [ ! -d "$HOME/google-cloud-sdk/bin" ]; then rm -rf $HOME/google-cloud-sdk; export
CLOUDSDK_CORE_DISABLE_PROMPTS=1; curl https://sdk.cloud.google.com | bash; fi
- source $HOME/google-cloud-sdk/path.bash.inc
- gcloud auth activate-service-account --key-file service-account.json
- gcloud components update
- gcloud components install docker-credential-gcr
- gcloud version
- eval $(ssh-agent -s)
- chmod 600 deploy_key_open
- echo -e "Host $SERVER_IP_ADDRESS\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
- ssh-add deploy_key_open
- gcloud auth configure-docker
# - sudo docker pull gcr.io/charged-formula-262616/web-client
# - sudo docker pull gcr.io/charged-formula-262616/web-nginx
deploy:
provider: script
script: bash ./deploy.sh
on:
branch: master
bash脚本是
# docker build -t gcr.io/charged-formula-262616/web-client:latest -t gcr.io/charged-formula-262616/web-client:$SHA -f ./client/Dockerfile ./client
# docker build -t gcr.io/charged-formula-262616/web-nginx:latest -t gcr.io/charged-formula-262616/web-nginx:$SHA -f ./nginx/Dockerfile ./nginx
# docker build -t gcr.io/charged-formula-262616/web-server:latest -t gcr.io/charged-formula-262616/web-server:$SHA -f ./server/Dockerfile ./server
docker push gcr.io/charged-formula-262616/web-client
docker push gcr.io/charged-formula-262616/web-nginx
docker push gcr.io/charged-formula-262616/web-server
# curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-274.0.1-linux-x86_64.tar.gz
# tar zxvf google-cloud-sdk-274.0.1-linux-x86_64.tar.gz google-cloud-sdk
# ./google-cloud-sdk/install.sh
# sudo docker container stop $(docker container ls -aq)
# echo "1 " | gcloud init
ssh -o StrictHostKeyChecking=no -i deploy_key_open travis-ci@104.196.226.118 << EOF
source /home/travis-ci/google-cloud-sdk/path.bash.inc
gcloud auth configure-docker
sudo docker-credential-gcloud list
sudo docker pull gcr.io/charged-formula-262616/web-nginx
sudo docker pull gcr.io/charged-formula-262616/web-client
sudo docker pull gcr.io/charged-formula-262616/web-server
sudo docker run --rm -d -p 3000:3000 gcr.io/charged-formula-262616/web-client
sudo docker run --rm -d -p 80:80 -p 443:443 gcr.io/charged-formula-262616/web-nginx
sudo docker run --rm -d -p 5000:5000 gcr.io/charged-formula-262616/web-server
sudo docker run --rm -d -v /database_data:/var/lib/postgresql/data -e POSTGRES_USER -e POSTGRES_PASSWORD -e POSTGRES_DB postgres
EOF
解决方案
您发布的错误包括指向身份验证方法的链接,其中建议了一些验证 docker 的机制,例如:
gcloud auth configure-docker
以及其他更高级的身份验证方法。我建议您检查一下,因为它将指导您解决问题。
要安装该gcloud
命令,您可以按照安装 Google Cloud SDK中的指南进行操作。对于 Linux 来说就是这个。
推荐阅读
- jquery - 每次无法验证单个选项卡
- java - 完整设置后运行方法
- kentico-kontent - `published` / `unpublished` webhook 在内容可用之前发送
- javascript - Fastify JSON Schema 默认值 `null`
- javascript - 如何组合这些正则表达式
- angular - Angular:收集的元数据包含将在运行时报告的错误:不支持 Lambda
- wordpress - .htaccess 无法解决 CORS 策略
- swift - 有没有办法重现 iOS 键盘中麦克风按钮的麦克风动作?
- python - 添加更改时如何保留 Heroku 对 Discord Python 应用程序所做的更改?
- python - 使用嵌套的 ifs,内部的“else”被跳过,而它应该被评估,我错过了什么?