从COS上运行的docker/compose容器访问私有Google容器注册表

从COS上运行的docker/compose容器访问私有Google容器注册表,docker,docker-compose,google-compute-engine,google-container-registry,Docker,Docker Compose,Google Compute Engine,Google Container Registry,我正在GCE上运行一个VM(使用Docker 17.03.2),并希望使用Docker compose来管理容器docker compose,但可以使用映像从容器中运行,如中所述: 我想访问的图像位于私有的Google容器注册表中,需要docker登录才能进行拉式访问。如何运行docker/compose映像以访问专用注册表 COS虚拟机已经被授权访问注册表,我在虚拟机上有一个服务帐户JSON文件,但是在运行up命令之前,可以将该文件传递到compose映像以登录吗?使用来自的

我正在GCE上运行一个VM(使用Docker 17.03.2),并希望使用
Docker compose
来管理容器docker compose,但可以使用映像从容器中运行,如中所述:

我想访问的图像位于私有的Google容器注册表中,需要
docker登录才能进行拉式访问。如何运行docker/compose映像以访问专用注册表


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

使用来自的
docker运行\
-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登录-u_json_key-p$(cat keyfile.json)https://gcr.io“向上”

您希望使用方法进行身份验证。

我找到的最佳解决方案是在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

如果COS VM已经获得访问注册表的授权(例如,附加的服务帐户具有承载映像的项目的GCS视图访问权),那么直接使用服务帐户JSON凭据的另一种选择是运行COS附带的
/usr/share/google/dockercfg_update.sh
脚本:

#!/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
#/垃圾箱/垃圾箱
#Chromium OS作者版权所有。版权所有。
#此源代码的使用受BSD样式许可证的约束,该许可证可以
#在许可证文件中找到。
set-eu
AUTH_DATA=“$(curl-s-f-m 10”http://metadata/computeMetadata/v1/instance/service-accounts/default/token" \
-H“元数据风格:谷歌”)
R=$?
如果[${R}-ne 0];然后
echo“身份验证令牌的curl已退出,状态为${R}”>&2
退出${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)
如果[-z“${AUTH}”];则
echo“在Auth_DATA${Auth_DATA}中找不到Auth令牌”>&2
出口1
fi
D=“${HOME}/.docker”
mkdir-p“${D}”

cat>“${D}/config.json“我无法让它发挥作用。我相信图像的入口点是
docker compose
,因此向其传递shell命令将不起作用。我想我必须从docker/compose创建一个新的映像,覆盖入口点,运行
docker login
,然后
docker compose up
。啊,对不起,发送到bash的命令应该是:
/bin/bash-c“docker login-u\u json\u key-p$(cat-keyfile.json)https://gcr.io;docker撰写“
该命令是否会因bash调用而失败?我知道您可以将JSON文件传递给
docker login
,但是如何在运行
docker compose up
之前从容器中运行该命令?该方法现在已在2019年被弃用。您应该使用
docker凭据gcr configure docker
。这会给出一个错误,即
docker:error-response-from-daemon:error-response-from-mount-source-path'/root/.docker':mkdir/root/.docker:read-only文件系统。
#!/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