【问题标题】:How do you deploy multiple docker containers to gcloud using Travis CI?如何使用 Travis CI 将多个 docker 容器部署到 gcloud?
【发布时间】:2020-04-23 16:32:42
【问题描述】:

我无法通过 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

【问题讨论】:

  • 您需要帮助解决什么问题?仅仅向我们展示两个没有解释的配置文件是没有帮助的。我们不会安装和运行它们来查看失败的原因。
  • 我现在遇到的当前错误是,当我通过 travis ci SSH 进入我的计算实例时,我收到错误说我没有权限从我的容器注册表中提取。但是,当我查看计算实例服务帐户权限时,我确实拥有对容器注册表的读写访问权限。所以基本上这就是我现在的大部分问题所在。
  • 请用这些细节更新问题。显示您得到的确切错误,以及哪个命令产生了错误。
  • 好的,我添加了确切的错误以及我认为导致它们的原因
  • 我添加了一些错误并更彻底地描述了问题区域。希望这会有所帮助

标签: linux docker google-compute-engine travis-ci gcloud


【解决方案1】:

您发布的错误包括指向Authentication methods 的链接,其中建议了一些验证 docker 的机制,例如:

gcloud auth configure-docker

以及其他更高级的身份验证方法。我建议您检查一下,因为它将指导您解决问题。

要安装gcloud 命令,您可以按照Installing Google Cloud SDK 中的指南进行操作。对于 Linux 来说是this

【讨论】:

  • 我尝试在我的 Travis CI 文件中使用它,但无论如何,在我 ssh 进入我的实例并尝试拉出我的 docker 容器后,我都会遇到权限问题。我什至尝试在 ssh 进入我的实例后运行它,但它仍然无法正常工作,除非我再次下载它,否则它也无法找到 gcloud 命令。所以我不确定我做错了什么......但感谢您的帮助
  • 我已经更新了答案。您是否尝试过分别执行脚本的一个和每个命令并检查输出?
  • 我了解到您现在使用两台计算机:一台本地计算机和 GCP 上的 GCE 实例?这是真的? gcloud 的 ssh 问题是在你的本地机器上吗?
  • 我正在使用我的本地机器来开发和测试我的 docker 容器,我使用 putty 连接到 GCE 实例只是为了测试一切,看看是否一切正常。但是,当我尝试使用 Travis CI 文件 ssh 进入它时,我遇到了问题。
  • 为了使用ssh,您可以在 GCE 实例中设置您的私钥并使用(Git bash 或 Linux bash)与本指南 cloud.google.com/compute/docs/instances/… 进行连接
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 2016-01-12
  • 2020-04-09
  • 2021-07-21
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 2020-07-01
相关资源
最近更新 更多