【问题标题】:Accessing private Google Container Registry from docker/compose container running on COS从 COS 上运行的 docker/compose 容器访问私有 Google Container Registry
【发布时间】:2017-07-14 20:48:12
【问题描述】:

我在 GCE(使用 Docker 17.03.2)上运行 Container-Optimized OS VM,并希望使用 docker-compose 来管理容器。 docker-compose 未安装在 COS 上,但可以使用映像 docker/compose 从容器中运行,如 this tutorial 中所述:

docker run \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD:/rootfs/$PWD" \
    -w="/rootfs/$PWD" \
    docker/compose:1.14.0 up

我要访问的图像位于私有 Google 容器注册表中,这需要 docker login 才能进行拉取访问。如何运行 docker/compose 镜像来访问私有注册表?

COS VM 已经被授权访问注册表,并且我在 VM 上有一个服务帐户 JSON 文件,但是可以在运行 up 命令之前将其传递给 compose 映像以登录吗?

【问题讨论】:

    标签: docker docker-compose google-compute-engine google-container-registry


    【解决方案1】:

    您想使用this 方法进行身份验证。

    【讨论】:

    • 我知道您可以将 JSON 文件传递​​给 docker login,但是如何在运行 docker-compose up 之前从容器中运行该命令?
    【解决方案2】:

    使用来自GCR's advanced authentication docs 的 _json_key 验证,以下脚本是否有效?

    docker run \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$PWD:/rootfs/$PWD" \ -w="/rootfs/$PWD" \ docker/compose:1.14.0 \ /bin/bash -c "docker login -u _json_key -p $(cat keyfile.json) https://gcr.io; up"

    【讨论】:

    • 我无法让它工作。我相信图像的入口点是docker-compose,因此将 shell 命令传递给它是行不通的。我想我必须从 docker/compose 创建一个新图像,覆盖入口点,运行docker login,然后运行docker-compose up
    • 抱歉,发送到 bash 的命令是:/bin/bash -c "docker login -u _json_key -p $(cat keyfile.json) https://gcr.io; docker-compose up" 命令是否因 bash 调用而失败?
    【解决方案3】:

    我找到的最佳解决方案是在 Docker 主机上进行身份验证,然后将 docker 配置挂载到 docker-compose 容器中:

    docker login -u _json_key -p "$(cat keyfile.json)" https://gcr.io
    docker run \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v /root/.docker:/root/.docker \
        -v "$PWD:$PWD" \
        -w="$PWD" \
        docker/compose:1.14.0 \
        up
    

    【讨论】:

    • 这给出了错误提示docker: Error response from daemon: error while creating mount source path '/root/.docker': mkdir /root/.docker: read-only file system.
    【解决方案4】:

    如果 COS VM 已被授权访问注册表(例如,附加的服务帐户对托管映像的项目具有 GCS 视图访问权限),则直接使用服务帐户 JSON 凭据的替代方法是运行 /usr/share/google/dockercfg_update.sh COS 自带的脚本:

    #!/bin/sh
    # Copyright 2015 The Chromium OS Authors. All rights reserved.
    # Use of this source code is governed by a BSD-style license that can be
    # found in the LICENSE file.
    
    set -eu
    
    AUTH_DATA="$(curl -s -f -m 10 "http://metadata/computeMetadata/v1/instance/service-accounts/default/token" \
      -H "Metadata-Flavor: Google")"
    R=$?
    if [ ${R} -ne 0 ]; then
      echo "curl for auth token exited with status ${R}" >&2
      exit ${R}
    fi
    
    AUTH="$(echo "${AUTH_DATA}" \
    | tr -d '{}' \
    | sed 's/,/\n/g' \
    | awk -F ':' '/access_token/ { print "_token:" $2 }' \
    | tr -d '"\n' \
    | base64 -w 0)"
    
    if [ -z "${AUTH}" ]; then
      echo "Auth token not found in AUTH_DATA ${AUTH_DATA}" >&2
      exit 1
    fi
    
    D="${HOME}/.docker"
    mkdir -p "${D}"
    cat > "${D}/config.json" <<EOF
    {
     "auths":{
      "https://container.cloud.google.com":{"auth": "${AUTH}"},
      "https://gcr.io":{"auth": "${AUTH}"},
      "https://b.gcr.io":{"auth": "${AUTH}"},
      "https://us.gcr.io":{"auth": "${AUTH}"},
      "https://eu.gcr.io":{"auth": "${AUTH}"},
      "https://asia.gcr.io":{"auth": "${AUTH}"},
      "https://beta.gcr.io":{"auth": "${AUTH}"}
     }
    }
    EOF
    

    这具有由 Google 维护的好处,并且无需管理服务帐户凭据。

    【讨论】:

    • 此方法已于 2019 年弃用。您应该使用 docker-credential-gcr configure-docker
    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 2017-11-09
    • 2017-06-03
    • 1970-01-01
    • 2014-12-29
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多