Я пытаюсь создать задание Cloud Run с помощью триггера из Cloud Build и секретов из Secret Manager. Мне удалось запустить триггер, который я использую для сборки Dockerfile, но сама сборка завершается со следующей ошибкой:
BUILD
Starting Step #0 - "build image"
Step #0 - "build image": Already have image (with digest): gcr.io/cloud-builders/docker
Step #0 - "build image": "docker build" requires exactly 1 argument.
Step #0 - "build image": See 'docker build --help'.
Step #0 - "build image":
Step #0 - "build image": Usage: docker build [OPTIONS] PATH | URL | -
Step #0 - "build image":
Step #0 - "build image": Build an image from a Dockerfile
Finished Step #0 - "build image"
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/docker" failed: step exited with non-zero status: 1
Что я уже пробовал:
--build-arg
s, и она действительно начала собираться! Похоже на ошибку.
Вот мой cloudbuild.yaml
:steps:
- id: "build image"
name: "gcr.io/cloud-builders/docker"
entrypoint: 'bash'
args:
['-c', 'docker build --build-arg CONTAINER_PRIVATE_KEY=$$PRIVATE_KEY --build-arg CONTAINER_PUBLIC_KEY=$$PUBLIC_KEY -t gcr.io/${PROJECT_ID}/${_JOB_NAME} .']
secretEnv: [ 'PRIVATE_KEY', 'PUBLIC_KEY' ]
- id: "push image"
name: "gcr.io/cloud-builders/docker"
args: [ "push", "gcr.io/${PROJECT_ID}/${_JOB_NAME}" ]
- id: "deploy to cloud run"
name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: gcloud
args:
[
'beta', 'run', '${_JOB_NAME}',
'--image', 'gcr.io/${PROJECT_ID}/${_JOB_NAME}',
'--region', '${_REGION}',
'--set-env-vars', "BUCKET=${_BUCKET}",
'--set-env-vars', "MNT_DIR=${_MNT_DIR}"
]
images:
- "gcr.io/${PROJECT_ID}/${_JOB_NAME}"
availableSecrets:
secretManager:
- versionName: "projects/${_PROJECT_ID_NUMBER}/secrets/${_CONTAINER_PRIVATE_KEY_SECRET_NAME}/versions/latest"
env: "PRIVATE_KEY"
- versionName: "projects/${_PROJECT_ID_NUMBER}/secrets/${_CONTAINER_PUBLIC_KEY_SECRET_NAME}/versions/latest"
env: "PUBLIC_KEY"
@guillaumeblaquiere пробовал менять кавычки и в entrypoint
, и в args
, к сожалению, не помогло. Та же ошибка
Хммм, я думаю, что я уже получил эту ошибку. Можете ли вы попробовать отобразить свой секретный контент? Я почти уверен, что у вас есть возврат строки в конце. Как вы создали секрет? с интерфейсом командной строки gcloud?
Я попытаюсь проверить это сейчас, но я создал свои секреты из gcloud CLI.
@guillaumeblaquiere Я только что повторил содержимое обоих секретов от секретного менеджера (с gcloud secrets access etc
) на свой терминал, и нет, похоже, в конце ни одного из них нет новой строки.
Вы использовали -n
, когда создавали свой секрет с помощью командной строки, вот так echo -n "my super secret data" | gcloud secrets create ...
Я так и сделал, моя команда выглядела так echo -n "secret_content" | gcloud secrets create secret_name --data-file=-
Хм, нет проблемы с секретным форматом. Итак, попробуйте найти значение параметра/подстановки с пробелом. Содержит ли _JOB_NAME пробел раньше? Секреты также содержат пробел перед значением?
Как я выяснил после некоторого возни, я обновил свой вопрос пунктом 4 - по какой-то причине эта проблема, кажется, вызвана build-arg
s - если я их удалю, Cloud Build фактически продолжит сборку образа. Проблема в том, что мне действительно нужны эти аргументы сборки, и без них изображение будет бесполезным.
Вот почему мое первое предположение было о секретном формате (возврат строки или пробел перед/в значении).
Я какое-то время отсутствовал с клавиатурой, поэтому могу проверить только сейчас - нет, проблема была не в этом, но я понял проблему, сейчас опубликую ответ.
Итак, после тщательного тестирования и опробования различных вариантов мне удалось выяснить, что вызывало проблему, ниже приведена правильная строка аргумента (она идет в аргументах):
["-c", "docker build --build-arg 'CONTAINER_PRIVATE_KEY=$$PRIVATE_KEY' --build-arg 'CONTAINER_PUBLIC_KEY=$$PUBLIC_KEY' -t gcr.io/${PROJECT_ID}/${_JOB_NAME} ."]
Проблема заключалась в отсутствии одинарных кавычек вокруг значений build-arg
s. По сути, в этом контексте значение build-arg
представляет собой одну строку, а не пару ключ-значение.
Можете ли вы попробовать использовать двойную кавычку «вместо простого»?