#node.js #docker #google-app-engine #gcloud
# #node.js #docker #google-движок приложений #gcloud
Вопрос:
Обычно я развертываю свое приложение NodeJS в Google App Engine и игнорирую все ресурсы docker при развертывании с помощью .gcloudignore
файла, как показано ниже:
.git
.gitignore
Dockerfile
docker-compose.yml
nginx/
redis-data/
.vscode/
.DS_Store
.prettierrc
README.md
node_modules/
.env
На прошлой неделе я успешно развернул свое приложение в App Engine без каких-либо проблем. Но сегодня (без каких-либо изменений, кроме исходного кода) произошел сбой и выдал мне ошибку:
ERROR: (gcloud.app.deploy) There is a Dockerfile in the current directory, and the runtime field in /Users/tranphongbb/Works/unstatic/habitify-annual-report-backend/app.yaml is currently set to [runtime: nodejs]. To use your Dockerfile to build a custom runtime, set the runtime field to [runtime: custom]. To continue using the [nodejs] runtime, please remove the Dockerfile from this directory.
Даже при удалении .gcloudignore
файла и skip_files
выборе опции in app.yaml
он все равно не удался.
Мое исходное дерево:
.dockerignore
.eslintrc.json
.gcloudignore
.gitignore
.prettierrc
.vscode
Dockerfile
README.md
app.yaml
docker-compose.yml
nginx
package.json
src
Ответ №1:
Я воспроизвел вашу проблему, клонировав оба Node.js Быстрый запуск App Engine Flex и добавление файла Dockerfile в ту же папку, что и файл app.yaml. Действительно, я получил то же сообщение об ошибке, что и вы. Но я смог увидеть, что если я перемещу Dockerfile в другой каталог, развертывание завершится успешно. Похоже, что gcloud app deploy не учитывает файл .gcloudignore.
Для node.js в гибкой среде в официальной документации App Engine нет записи skip_files.
Чтобы игнорировать ваши файлы, определенные в файле .gcloudignore, пожалуйста, запустите команду gcloud beta app deploy
, которая помогла мне игнорировать Dockerfile при использовании среды выполнения Nodejs в app.yaml, или вы можете использовать gcloud app deploy
command, но переместить свой Dockerfile в другой каталог.
Комментарии:
1. Перемещение Dockerfile в другой каталог — плохой способ, но у меня его не осталось. Спасибо. Я приму ваш ответ: D.
2. Вы пытались выполнить развертывание с помощью gcloud beta app deploy, сохраняя Dockerfile в том же каталоге?
3. Он загрузил более 20 тысяч файлов в облако, я предположил, что это будет папка node_modules. Поэтому он просто следует определенному в app.yaml времени выполнения и не относится ни к чему другому.
4. Я повторно открыл этот общедоступный запрос на отслеживание проблем от вашего имени, чтобы команда Google Cloud Platform изучила проблему. Пожалуйста, следите за проблемой, и вы будете в курсе этого поведения.
Ответ №2:
Цель .gcloudignore
файла — избежать загрузки определенных файлов в App Engine, облачные функции и т. Д., Развертывания, Которые описаны здесь . При использовании gcloud app deploy
этой команды вы заметите, есть ли a Dockerfile
, и сопоставите, что в app.yaml
нем установлено runtime: custom
. В случае, если это условие не выполняется, вы получите аналогичное сообщение об ошибке следующим образом:
ERROR: (gcloud.app.deploy) There is a Dockerfile in the current directory, and the runtime field in path/app.yaml is currently set to [runtime: nodejs]. To use your Dockerfile to build a custom runtime, set the runtime field to [runtime: custom]. To continue using the [nodejs] runtime, please remove the Dockerfile from this directory.
Теперь последний вопрос, почему это работает с gcloud beta app deploy
, а не с gcloud app deploy
?
Проверка исходного кода Cloud SDK, который может быть просмотрен любым пользователем, gcloud app deploy
имеет следующий код, который выполняет проверку, упомянутую ранее:
if info.runtime == 'custom':
if has_dockerfile and has_cloudbuild:
raise CustomRuntimeFilesError(
('A custom runtime must have exactly one of [{}] and [{}] in the '
'source directory; [{}] contains both').format(
config.DOCKERFILE, runtime_builders.Resolver.CLOUDBUILD_FILE,
source_dir))
elif has_dockerfile:
log.info('Using %s found in %s', config.DOCKERFILE, source_dir)
return False
elif has_cloudbuild:
log.info('Not using %s because cloudbuild.yaml was found instead.',
config.DOCKERFILE)
return True
else:
raise NoDockerfileError(
'You must provide your own Dockerfile when using a custom runtime. '
'Otherwise provide a "runtime" field with one of the supported '
'runtimes.')
else:
if has_dockerfile:
raise DockerfileError(
'There is a Dockerfile in the current directory, and the runtime '
'field in {0} is currently set to [runtime: {1}]. To use your '
'Dockerfile to build a custom runtime, set the runtime field to '
'[runtime: custom]. To continue using the [{1}] runtime, please '
'remove the Dockerfile from this directory.'.format(info.file,
С другой стороны gcloud beta app deploy
, эта проверка вообще не выполняется (при условии, что я просмотрел правильный код):
if runtime == 'custom' and self in (self.ALWAYS,
self.WHITELIST_BETA,
self.WHITELIST_GA):
return needs_dockerfile
В заключение, .gcloudignore
это предотвратит загрузку некоторых файлов / папок, но не будет учитываться при выполнении некоторых предварительных проверок этой команды. В этом случае Dockerfile
следует учитывать a, поскольку он может быть частью развертывания.