#docker #sdk #docker-api
#docker #sdk #docker-api
Вопрос:
Я использую Docker SDK для Python для загрузки локального хранилища образов в реестр Docker (в моем случае DockerHub).)
Я использую метод «push» для «client.images», описанный в документации здесь.
К сожалению, все опубликованные репозитории являются общедоступными. Похоже, что нет флага для отправки в частный репозиторий или для обеспечения того, чтобы отправленный репозиторий был частным. Возможно ли это с помощью Docker Python API?
Я пробовал это тремя отдельными способами (все они приводят только к общедоступному репозиторию):
- Способ первый: отдельный вход в систему (работает, но приводит к общедоступному репозиторию):
client = docker.from_env() auth_client = client.login(username = "kelly_peyton", password = "nightingale", email = "kpeyton@prophet5.org", registry = "docker.io", reauth = True) # other code here, not shown, to validate login succeeded cli = APIClient(base_url="unix:///var/run/docker.sock") br = cli.build(path = temp_local, dockerfile = f"{temp_local}/Dockerfile", tag = docker_repo_reference_tagged) # other code here, not shown, to validate build succeeded push_res = cli.push(repository = f"{docker_repo_reference}", tag = docker_repo_tag, stream = False, decode = False)
- Способ второй: учетные данные передаются для push-вызова
(работает, но приводит к общедоступному репозиторию):
client = docker.from_env() cli = APIClient(base_url="unix:///var/run/docker.sock") br = cli.build(path = temp_local, dockerfile = f"{temp_local}/Dockerfile", tag = docker_repo_reference_tagged) # other code here, not shown, to validate build succeeded push_res = cli.push(repository = f"{docker_repo_reference}", tag = docker_repo_tag, stream = False, auth_config = { "username" : "kelly_peyton", "password" : "nightingale", "email" : "kpeyton@prophet5.org", "registry" : "docker.io" }, decode = False)
- Третий способ: вход в систему из командной строки (не с помощью кода)
(работает, но приводит к общедоступному репозиторию):
client = docker.from_env() cli = APIClient(base_url="unix:///var/run/docker.sock") br = cli.build(path = temp_local, dockerfile = f"{temp_local}/Dockerfile", tag = docker_repo_reference_tagged) # other code here, not shown, to validate build succeeded push_res = cli.push(repository = f"{docker_repo_reference}", tag = docker_repo_tag, stream = False, decode = False)
Все три метода работают, поскольку образ действительно загружается в реестр (в моем случае DockerHub), и, очевидно, аутентификация сработала, поскольку я отправляю его в свою личную учетную запись DockerHub. Однако изображения всегда являются общедоступными.
Комментарии:
1. Можете ли вы поделиться кодом python?
2. @ozlevka спасибо. Теперь включен код.
3. Первая ссылка не работает, это docker-py.readthedocs.io/en/stable
Ответ №1:
Вы не можете сделать репозиторий приватным, установив свои учетные данные в API. Это позволяет отправлять образ только в ваше хранилище.
Вы должны создать или преобразовать репозиторий, чтобы он был приватным. Пожалуйста, прочтите документацию, чтобы узнать, как это сделать. Как правило, только вы можете отправить его в репозиторий. Если репозиторий общедоступен, то загрузить может каждый, если репозиторий приватен, то загрузить можете только вы.
Комментарии:
1. Спасибо за ваш комментарий. Вы отметили «Вы должны создать или преобразовать репозиторий, чтобы он был приватным», хотя цель здесь — использовать Docker Python SDK для этого (а не делать это вручную).) Разве Docker Python SDK не предоставляет средства для настройки этого программно? Похоже, что нет, но в этом и заключается цель вопроса — сделать это программно или минимально через командную строку (которую затем можно вызвать программно)
2. @CoderOfTheNight вы можете использовать какой-либо другой реестр docker, когда сможете создать приватный репозиторий по умолчанию.