Я хочу вручную загрузить образ Docker из Docker Hub . Более конкретно, я хочу загрузить образ Docker из Docker Hub на машине в ограниченной среде, на которой не установлено (и не может быть установлено) клиентское программное обеспечение Docker. Я бы подумал, что это будет возможно с использованием официального API , но это не так - см. Следующее обсуждение:
Неужели API не поддерживает загрузку изображений? Есть ли способ обойти это?
ОБНОВЛЕНИЕ 1:
Я наткнулся на следующий пост ServerFault:
В принятом решении используется docker save
команда, которая не помогает в моей ситуации. Но другое решение, опубликованное там, ссылается на следующее сообщение StackOverflow:
Одно из решений здесь относится к инструменту командной строки, называемому docker-registry-debug, который, помимо прочего, может генерировать curl
команду для загрузки образа. Вот что я получил:
user@host:~$ docker-registry-debug curlme docker ubuntu
# Reading user/passwd from env var "USER_CREDS"
# No password provided, disabling auth
# Getting token from https://index.docker.io
# Got registry endpoint from the server: https://registry-1.docker.io
# Got token: signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read
curl -i --location-trusted -I -X GET -H "Authorization: Token signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read" https://registry-1.docker.io/v1/images/ubuntu/layer
user@host:~$ curl \
-i --location-trusted -I -X GET \
-H "Authorization: Token signature=1234567890abcde1234567890abcde1234567890,repository="library/docker",access=read"
https://registry-1.docker.io/v1/images/ubuntu/layer
HTTP/1.1 404 NOT FOUND
Server: gunicorn/18.0
Date: Wed, 29 Nov 2017 01:00:00 GMT
Expires: -1
Content-Type: application/json
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 29
X-Docker-Registry-Version: 0.8.15
X-Docker-Registry-Config: common
Strict-Transport-Security: max-age=31536000
Так что, к сожалению, похоже, что curl
сгенерированная команда не работает.
ОБНОВЛЕНИЕ 2:
Похоже, я могу загружать капли слоя из Docker Hub. Вот как я сейчас это делаю.
Получить токен авторизации:
user@host:~$ export TOKEN=\
"$(curl \
--silent \
--header 'GET' \
"https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull" \
| jq -r '.token' \
)"
Вытащите манифест изображения:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq '.'
Вытяните манифест изображения и извлеките суммы BLOB-объектов:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq -r '.fsLayers[].blobSum'
sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
sha256:be588e74bd348ce48bb7161350f4b9d783c331f37a853a80b0b4abc0a33c569e
sha256:e4ce6c3651b3a090bb43688f512f687ea6e3e533132bcbc4a83fb97e7046cea3
sha256:421e436b5f80d876128b74139531693be9b4e59e4f1081c9a3c379c95094e375
sha256:4c7380416e7816a5ab1f840482c9c3ca8de58c6f3ee7f95e55ad299abbfe599f
sha256:660c48dd555dcbfdfe19c80a30f557ac57a15f595250e67bfad1e5663c1725bb
Загрузите однослойный блоб и запишите его в файл:
user@host:~$ BLOBSUM=\
"sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
user@host:~$ curl \
--silent \
--location \
--request GET \
--header "Authorization: Bearer ${TOKEN}" \
"https://registry-1.docker.io/v2/library/ubuntu/blobs/${BLOBSUM}" \
> "${BLOBSUM/*:/}.gz"
Запишите все суммы больших двоичных объектов в файл:
user@host:~$ curl \
--silent \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
'https://registry-1.docker.io/v2/library/ubuntu/manifests/latest' \
| jq -r '.fsLayers[].blobSum' > ubuntu-blobsums.txt
Загрузите все капли слоя из манифеста:
user@host:~$ while read BLOBSUM; do
curl \
--silent \
--location \
--request 'GET' \
--header "Authorization: Bearer ${TOKEN}" \
"https://registry-1.docker.io/v2/library/ubuntu/blobs/${BLOBSUM}" \
> "${BLOBSUM/*:/}.gz"; \
done < blobsums.txt
Теперь у меня есть куча слоев, и мне нужно объединить их в изображение - я думаю.
Ссылки по теме:
Форумы сообщества Docker: Docker Hub API извлекает изображения
Форумы сообщества Docker: загрузка изображений Docker Hub вручную
Docker Проблема № 1016: Извлечение изображений Docker без команды Docker . например, с помощью wget
ServerFault: загрузка образа Docker для передачи на компьютер, не подключенный к Интернету
StackOverflow: загрузка образа докера для передачи на компьютер, не подключенный к Интернету
StackOverflow: Как загрузить образы докера без использования команды pull?
Ответы:
Получается, что у Moby Project есть сценарий оболочки на Moby Github, который может загружать изображения из Docker Hub в формате, который можно импортировать в Docker:
Синтаксис использования для сценария определяется следующим образом:
Затем изображение можно импортировать с помощью
tar
иdocker load
:Чтобы убедиться, что скрипт работает должным образом, я загрузил образ Ubuntu из Docker Hub и загрузил его в Docker:
На практике я бы сначала скопировать данные от клиента интернет (что не имеет Docker установлен) к машине целевой / назначения (который действительно имеет Docker установлен):
а затем загрузите и используйте изображение на целевом хосте:
источник
The machine with internet connectivity does not and cannot have Docker installed
, но выdocker load
Существует инструмент под названием Skopeo, который может извлекать изображения Docker из репозитория и сохранять их в нескольких форматах.
Например:
Загрузите изображение и сохраните слои в виде tarball:
skopeo copy docker://ubuntu docker-archive:/tmp/ubuntu.tar:ubuntu
Перейдите
/tmp/ubuntu.tar
на другую машину, если хотите.Загрузите изображение на экземпляр Docker, у которого нет подключения к Интернету:
docker load --input /tmp/ubuntu.tar
Он доступен в репозитории CentOS 7 с именем пакета
skopeo
. В настоящее время нет пакетов Debian или Ubuntu (но их легко скомпилировать).источник
спасибо за мотивацию. Я сделал версию PowerShell этого. Проверьте это ... С его помощью вы можете перемещаться в контейнерах dockerhub в ограниченные сети докеров с рабочим столом Windows и инструментом ssh-scp на докер без прав администратора или администратора.
https://gitlab.com/Jancsoj78/dockerless_docker_downloader новый хакерский инструмент :)
источник
Для меня не совсем понятно, чего вы пытаетесь достичь и почему попытки не являются решением проблемы. Если мне нужно будет решить эту проблему, я бы хотел, чтобы @Tensibai и другие вопросы и ответы указывали: сначала сделайте докер в системе с подключением к Интернету, сохраните образ докера, скопируйте его на компьютер без подключения к Интернету, загрузите образ и запустите его. ,
демонстрация
В системе A нет изображений:
Вытащите изображение из dockerhub:
Сохранить изображение докера:
Скопируйте образ докера в systemB и загрузите его.
источник
Вот адаптированный скрипт на python, который, таким образом, имеет независимое от ОС решение: docker-drag
Используйте его таким образом, и он создаст архив TAR, который вы сможете импортировать с помощью Docker Load:
источник
{}
кнопку (код) в верхней панели редактора, чтобы отформатировать его.