Доступ к частному реестру контейнеров Google из контейнера docker / compose, работающего на COS

Я использую виртуальную машину оптимизированной для контейнеров ОС на GCE (с Docker 17.03. 2) и хотели бы использовать docker-compose для управления контейнерами. docker-compose не установлен в COS, но его можно запустить из контейнера с помощью образа docker / составить, как описано в этом руководстве < / а>:

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 уже авторизована для доступа к реестру, и у меня есть JSON-файл служебной учетной записи на виртуальной машине, но можно ли передать его в созданный образ для входа в систему перед запуском команды up?




Ответы (4)


Вы хотите использовать этот метод для аутентификации.

person mattmoor    schedule 14.07.2017
comment
Я понимаю, что вы можете передать файл JSON в docker login, но как запустить эту команду из контейнера перед запуском docker-compose up? - person Todd M; 15.07.2017

При использовании антиутентификации _json_key из расширенных документов аутентификации GCR выполняется следующий сценарий Работа?

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"

person jsand    schedule 14.07.2017
comment
Я не могу заставить это работать. Я считаю, что точкой входа для изображения является docker-compose, поэтому передача в него команды оболочки не сработает. Думаю, мне придется создать новый образ из docker / compose, переопределить точку входа, запустить docker login, а затем docker-compose up. - person Todd M; 15.07.2017
comment
Ах, извините, команда, отправляемая в bash, будет выглядеть так: /bin/bash -c "docker login -u _json_key -p $(cat keyfile.json) https://gcr.io; docker-compose up" Ошибка выполнения команды при вызове bash? - person jsand; 18.07.2017

Лучшее решение, которое я нашел, - это пройти аутентификацию на хосте 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
person Todd M    schedule 19.07.2017
comment
Это дает сообщение об ошибке docker: Error response from daemon: error while creating mount source path '/root/.docker': mkdir /root/.docker: read-only file system. - person Debdut Goswami; 01.06.2021

Альтернативой непосредственному использованию учетных данных JSON служебной учетной записи, учитывая, что виртуальная машина COS уже авторизована для доступа к реестру (например, подключенная служебная учетная запись имеет доступ к просмотру GCS для проекта, на котором размещен образ), является запуск сценария /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 и позволяет избежать необходимости управлять учетными данными сервисной учетной записи.

person MrAlias    schedule 26.07.2017
comment
В 2019 году этот метод устарел. Вы должны использовать docker-credential-gcr configure-docker. - person jmcd; 17.05.2019