GitLab CI Runner 无法拉取私有 Docker 镜像。 “没有基本的身份验证凭据”,但它可以通过 SSH 工作

问题描述 投票:0回答:3

我已经查看了 SO 上的相关问题,这似乎不是重复的。

当 GitLab CI Runner 从 AWS ECR 提取映像时,它失败并出现以下错误:

ERROR: Preparation failed: API error (500): \
  Get https://***.dkr.ecr.***.amazonaws.com/v2/***/manifests/latest: no basic auth credentials

但是我已经使用 ECR 凭据设置了机器,我可以通过 SSH 连接到它,并且

root
gitlab-runner
用户都可以拉取图像。直到最近,这一切都运行良好,但我不知道可能会发生什么变化。

“没有基本身份验证”到底意味着什么?

具体来说,这些是我所做的步骤:

  • 启动一个普通的 AWS EC2 Linux 实例,并通过 SSH 进入其中

然后:

sudo su
echo -e "\n\nexport http_proxy=http://www-proxy.internal.novastone.net:3128\nexport HTTP_PROXY=http://www-proxy.internal.novastone.net:3128\nexport https_proxy=http://www-proxy.internal.novastone.net:3128\nexport HTTPS_PROXY=http://www-proxy.internal.novastone.net:3128" >> ~/.bashrc
echo -e "\n\nexport http_proxy=http://www-proxy.internal.novastone.net:3128\nexport HTTP_PROXY=http://www-proxy.internal.novastone.net:3128\nexport https_proxy=http://www-proxy.internal.novastone.net:3128\nexport HTTPS_PROXY=http://www-proxy.internal.novastone.net:3128" >> /home/ec2-user/.bashrc
yum update -y
yum install -y docker
mkdir ~/.docker
echo -e "{\n    \"proxies\": {\n        \"default\": {\n            \"httpProxy\": \"http://***:3128\",\n            \"httpsProxy\": \"http://***:3128\"\n        }\n    }\n}\n"> ~/.docker/config.json
echo -e "export http_proxy=http://***:3128\nexport HTTP_PROXY=http://***:3128\nexport https_proxy=http://***:3128\nexport HTTPS_PROXY=http://***:3128\n" > /etc/sysconfig/docker
service docker start
usermod -a -G docker ec2-user
docker pull hello-world  # To verify basic functionality
curl -s https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | bash
yum install -y gitlab-ci-multi-runner-1.11.5-1.x86_64
usermod -a -G docker gitlab-runner
pip install awscli --upgrade --user
aws configure
$(aws ecr get-login --no-include-email --region ***)
docker pull ***.dkr.ecr.***.amazonaws.com/***:latest  # To verify ECR works
gitlab-ci-multi-runner register
exit # Drop back to ec2-user
sudo -u gitlab-runner bash
echo -e "\n\nexport http_proxy=http://www-proxy.internal.novastone.net:3128\nexport HTTP_PROXY=http://www-proxy.internal.novastone.net:3128\nexport https_proxy=http://www-proxy.internal.novastone.net:3128\nexport HTTPS_PROXY=http://www-proxy.internal.novastone.net:3128" >> /home/gitlab-runner/.bashrc
aws configure
$(aws ecr get-login --no-include-email --region ***)
docker pull ***.dkr.ecr.***.amazonaws.com/***:latest  # ECR works here as well

此时,ECR 图像显示在所有用户中都可以工作。据我所知,通过设置 env,我已经完全绕过了我们的代理。为所有用户永久设置变量,Docker 可以在任何 SSH 情况下正常运行,并且当 GitLab Runner 参与时,

no basic auth credentials
仍然存在。为什么?有什么理论吗?感谢所有帮助或想法!

编辑:FWIW 我也在 GitLab 论坛上询问过

docker gitlab gitlab-ci amazon-ecs gitlab-ci-runner
3个回答
2
投票

拥有 Gitlab 进程的 Linux 用户很可能没有所需的凭据。您可以通过运行

sudo -u <username> -H <command>

来测试这一点

或者,您可以将

--user
参数传递给运行程序命令以使用可以登录 ECR 的 Linux 用户。


1
投票

我开始使用 AWS ECR 访问来运行我的 GitLab 运行程序。 我使用 Ubuntu18 AMI 并在 ec2 配置的用户数据中使用以下脚本,或者可以通过 ssh 进入服务器以 root 身份运行脚本。 将角色附加到具有足够 ECR 访问权限的 EC2 实例。

要点链接:

https://gist.github.com/piyushsonigra/6f67210aefcbee8071f46dc764fa8936

#!/bin/bash
set -e
apt update -y && apt install awscli make -y
curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb
dpkg -i gitlab-runner_amd64.deb
sed -i -e '/volumes/s/\["\/cache\"]/\["\/cache","\/var\/run\/docker.sock:\/var\/run\/docker.sock"]/' /etc/gitlab-runner/config.toml
curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && usermod -aG docker gitlab-runner
gitlab-runner register \
  --non-interactive \
  --url $GITLAB_URL \
  --registration-token $TOKEN \
  --executor "docker" \
  --docker-image "docker:latest" \
  --description "gitlab-runner" \
  --tag-list "gitlab,runner,aws" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"
echo -e "export AWS_SDK_LOAD_CONFIG=true \nexport AWS_REGION=$REGION >> ~/.bashrc
source ~/.bashrc && mkdir ~/.docker
cat <<EOF >>~/.docker/config.json
{
  "credsStore": "ecr-login"
}
EOF
git clone https://github.com/awslabs/amazon-ecr-credential-helper.git
cd amazon-ecr-credential-helper/ && make docker 
cp bin/local/docker-credential-ecr-login /usr/local/bin/
systemctl restart docker  && gitlab-runner restart
export AWS_REGION=$REGION && docker-credential-ecr-login list >> ~/.ecr-url.log

我们应该将最后一个命令输出作为 ECR URL 获取到 ~/.ecr-url.log

然后您可以使用 repo 根目录下的 .gitlab-ci.yml 文件运行提交或运行管道。 以下是 .gitlab-ci.yml 测试管道的示例代码。

image: aws_account_id.dkr.ecr.REGION.amazonaws.com/IMAGE_NAME:latest

build:
  stage: build
  script:
  - echo "hello"

0
投票

在尝试了多种解决方案之后,这个简单的方法对我有用:

  1. 通过 SSH 连接到您的 GitLab Runner 实例。
  2. 运行
    aws configure
    设置 AWS CLI。
  3. 使用 ECR 验证 Docker:
    aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <registry-id>.dkr.ecr.<region>.amazonaws.com
    
  4. ~/.docker/config.json
    复制凭据。
  5. 在 GitLab CI/CD 设置中,使用步骤 4 中的内容定义变量
    DOCKER_AUTH_CONFIG

这允许运行者在管道作业期间访问您的私有 ECR 注册表。

© www.soinside.com 2019 - 2024. All rights reserved.