我查看了有关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
用户都可以提取图像。直到最近,这一切都很好,但我不知道可能会有什么变化。
“没有基本认证”甚至暗示什么?
具体来说,这些是我已经完成的步骤:
然后:
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 I've also asked on the GitLab forum。
答案 0 :(得分:1)
我的GitLab运行程序具有AWS ECR访问权限。 我使用了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.log中获得作为ECR URL的
然后,您可以在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"
答案 1 :(得分:0)
拥有Gitlab进程的linux用户可能没有所需的凭据。您可以通过运行{{1}}
来测试此问题或者,您可以将{{1}}参数传递给runner命令,以使用可以登录ECR的linux用户。