Мы столкнулись с проблемой, из-за которой мы не можем отправить образы Docker в наш реестр Nexus с помощью kaniko. Ниже я предоставил минимальный репродукция, которую мы используем Nexus OSS 3.49.0-02
.
Это приводит к ошибке 404 с использованием неправильного шаблона URL-адреса для доступа к Dockerapi v2:
error checking push permissions -- make sure you entered the correct tag name, and that you are authenticated correctly, and try
again: checking push permission for "private.registry.com/repository/imagename:tag": creating push check transport for
private.registry.com failed: GET https://private.registry.com/v2/: unexpected status code 404 Not Found:
...[html]...
Наша часть сценария Gitlab-CI выглядит так:
- echo "{\"auths\":{\"private.registry.com":{\"auth\":\"$NEXUS_DEPLOY_USER_PW_BASE64\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor
--context "${CI_PROJECT_DIR}/frontend"
--dockerfile "${CI_PROJECT_DIR}/frontend/Dockerfile.app-builder"
--build-arg=CI_COMMIT_SHA=$CI_COMMIT_SHA
--build-arg=CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH
--build-arg=CI_COMMIT_TAG=$CI_COMMIT_TAG
--destination "$BASE_URL/app-ui:$APP_VERSION"
--destination "$BASE_URL/app-ui:$BRANCH_TAG"
--destination "$BASE_URL/app-ui"
Он также не работает с учетными данными, не закодированными в Base64 NEXUS_DEPLOY_USER_PW_BASE64
. Поэтому в примере воспроизведения я предоставил аутентификацию, отличную от Base64.
FROM gcr.io/kaniko-project/executor:v1.14.0-debug
ADD Dockerfile.test Dockerfile.test
ARG REGISTRY_URL=[YOUR_NEXUS_URL]/repository/dockercontainer
ARG REGISTRY_USER=[your credential]
ARG REGISTRY_PASSWORD=[your credential]
RUN echo "{\"auths\":{\"$REGISTRY_URL\":{\"username\":\"$REGISTRY_USER\",\"password\":\"$REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
RUN /kaniko/executor --context "." --dockerfile "Dockerfile.test" --destination "${REGISTRY_URL}/test:latest"
CMD [ "echo", "Hello World" ]
FROM alpine:latest
CMD [ "echo", "Hello World" ]
В директории kaniko запустите docker build .
kaniko
|__ Dockerfile
|__ Dockerfile.test
это репродукция. Ваш комментарий не имеет никакого смысла :D
Именно этот случай описан в официальной документации.
Невозможно предоставить клиенту Docker путь к контексту приложения или путь к базовому реестру. Docker нужен реестр, открытый в корне хоста + порт, к которому он обращается.
Ознакомьтесь с стратегиями обратного прокси для получения рекомендаций, но обычно они сводятся к следующему:
private.registry.com:8091/imagename:tag
repository.private.registry.com
на private.registry.com:8091
, а затем используйте repository.private.registry.com/imagename:tag
в kaniko.Немного не по теме, но вы также можете избавиться от Нексуса и использовать вместо него Harbour, который поддерживает сценарий private.registry.com/repository/imagename:tag
из коробки.
Не забудьте отметить флагом
-t
свое изображение.docker build -t {image-name}:{tag} .