如何安全地登录gitlab中的私有docker注册表?

时间:2018-03-12 09:38:50

标签: security docker passwords gitlab gitlab-ci

我知道有秘密变量,我尝试将秘密传递给bash脚本。 在具有#!/bin/bash -x的bash脚本上使用时,使用docker login命令时可以以明文形式看到密码:

docker login "$USERNAME" "$PASSWORD" $CONTAINERREGISTRY

有没有办法安全地登录gitlab-ci中的容器注册表?

2 个答案:

答案 0 :(得分:2)

如果需要多个认证,则可以在before_script文件的开头或每个作业内部使用gitlab-ci.yml

before_script:
  - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin 

其中$CI_REGISTRY_USERCI_REGISTRY_PASSWORD是秘密变量。

在每个脚本之后或在整个文件的开头:

after_script:
    - docker logout

我写了一个关于使用Gitlab CI和Docker构建docker映像的答案: https://stackoverflow.com/a/50684269/8247069

答案 1 :(得分:1)

GitLab在运行作业时提供一系列环境变量。您需要熟悉并在开发(运行测试版本等)时使用它们,这样您就不需要做任何事情,只需在GitLab中相应地设置CI / CD变量(例如ENV)即可,而Gitlab将提供大部分功能你想要的。参见GitLab Environment variables

只需稍稍调整一下以前的建议(将GitLab建议与此结合)。

有关在何处/如何使用before_script和after_script的更多信息,请参见.gitlab-ci-yml Configuration parameters。我倾向于将登录命令作为最后的命令之一放在我的主before_script中(不在阶段中),而将注销退出到最终命令中。 “ after_script”。

before_script:
  - echo "$CI_REGISTRY_PASSWORD" | docker login "$CI_REGISTRY" -u "$CI_REGISTRY_USER" --password-stdin;

然后继续下载.gitlab-ci.yml ...

after_script:
  - docker logout;

对于我的本地开发,我创建一个遵循通用约定的.env文件,然后以下bash代码段将检查该文件是否存在并将这些值导入到您的shell中。为了使我的项目安全和友好,.env被忽略,但是我维护了一个带有安全示例值的.env.sample,并且我确实将其包括在内。

if [ -f .env ]; then printf "\n\n::Sourcing .env\n" && set -o allexport; source .env; set +o allexport; fi

这是一个最完整的示例:

image: docker:19.03.9-dind

stages:
  - buildAndPublish

variables:
  DOCKER_TLS_CERTDIR: "/certs"
  DOCKER_DRIVER: overlay2
services:
  - docker:19.03.9-dind

before_script:
  - printf "::GitLab ${CI_BUILD_STAGE} stage starting for ${CI_PROJECT_URL}\n";
  - printf "::JobUrl=${CI_JOB_URL}\n";
  - printf "::CommitRef=${CI_COMMIT_REF_NAME}\n";
  - printf "::CommitMessage=${CI_COMMIT_MESSAGE}\n\n";
  - printf "::PWD=${PWD}\n\n";
  - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin;

build-and-publish:
  stage: buildAndPublish
  script:
    - buildImage;
    - publishImage;
  rules:
    - if: '$CI_COMMIT_REF_NAME == "master"' # Run for master, but not otherwise
      when: always
    - when: never

after_script:
  - docker logout registry.gitlab.com;