Развертывание приложения Gcloud не может игнорировать Dockerfile

#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, поскольку он может быть частью развертывания.