Отправка частного образа в реестр Docker через Docker API

#docker #sdk #docker-api

#docker #sdk #docker-api

Вопрос:

Я использую Docker SDK для Python для загрузки локального хранилища образов в реестр Docker (в моем случае DockerHub).)

Я использую метод «push» для «client.images», описанный в документации здесь.

К сожалению, все опубликованные репозитории являются общедоступными. Похоже, что нет флага для отправки в частный репозиторий или для обеспечения того, чтобы отправленный репозиторий был частным. Возможно ли это с помощью Docker Python API?

Я пробовал это тремя отдельными способами (все они приводят только к общедоступному репозиторию):

  1. Способ первый: отдельный вход в систему (работает, но приводит к общедоступному репозиторию):
 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)
  
  1. Способ второй: учетные данные передаются для 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)
  
  1. Третий способ: вход в систему из командной строки (не с помощью кода)
    (работает, но приводит к общедоступному репозиторию):
 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, когда сможете создать приватный репозиторий по умолчанию.