从COS上运行的docker/compose容器访问私有Google容器注册表
我正在GCE上运行一个VM(使用Docker 17.03.2),并希望使用从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映像以登录吗?使用来自的
Docker compose
来管理容器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