Azure веб-приложение для контейнера - ошибка при запуске - не отвечает на HTTP-запросы - PullRequest
0 голосов
/ 12 апреля 2020

Я столкнулся с досадной проблемой, когда мое контейнерное приложение нормально работает локально, но не удается при развертывании на azure, несмотря на то, что порты открыты правильно.

Подробности:

  • azure веб-приложение для контейнера с Linux ОС на компьютере Basi c B1.
  • nodejs v12 LTS с сервером express, прослушивающим HTTPS-порт 443. Включает обработчик ошибок HTTP 404 (не найден).
  • база данных db Mongodb Atlas в песочнице M0 (бесплатный уровень). Локальные и Azure IP-адреса в белом списке.
  • docker контейнер с использованием Dockerfile. нет Kubernetes, нет конфигурационного файла yml.
  • docker изображение, размещенное в приватном Docker репозитории-концентраторе, извлечено azure при сборке

Локально работает на Windows 10 x64:

  • без docker: node app.js работает нормально через https://localhost: 443

  • с docker: docker build -t myapp:latest ., затем docker run -p 49160:443 -d myapp:latest работает нормально через https://localhost: 49160

В обоих случаях я получаю ожидаемый результат из моего приложения nodejs :

Running in production on x64
Express HTTPS server listening on port 443
mongo :: connected to database mydb at mydb-tot7b.azure.mongodb.net

(очевидно, myapp и mydb не являются настоящими именами. Используются здесь для удобства.)

Работает в azure:

В разделе «Настройка» -> Настройки приложения:

PORT=443
WEBSITES_PORT=443
DOCKER_ENABLE_CI=true

Конфигурация конвейера, извлекающая docker изображение myrepo/myapp:latest из частного Docker Репозитория Hub при сборке. Изображение вытащено правильно. Ошибка через https://myapp.azurewebsites.net/ с ошибкой 503 Сервис временно недоступен .

Azure Журнал:

2020-04-10 18:02:21.040 INFO  - Pulling image: myrepo/myapp:latest
2020-04-10 18:02:22.128 INFO  - latest Pulling from myrepo/myapp
2020-04-10 18:02:22.129 INFO  -  Digest: sha256:982[...]
2020-04-10 18:02:22.129 INFO  -  Status: Image is up to date for myrepo/myapp:latest
2020-04-10 18:02:22.131 INFO  - Pull Image successful, Time taken: 0 Minutes and 1 Seconds
2020-04-10 18:02:22.143 INFO  - Starting container for site
2020-04-10 18:02:22.144 INFO  - docker run -d -p 7909:443 --name myapp_0_138f197c -e PORT=80 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITES_PORT=443 -e WEBSITE_SITE_NAME=myapp -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=myapp.azurewebsites.net -e WEBSITE_INSTANCE_ID=6fc3[...] myrepo/myapp:latest
2020-04-10 18:02:22.144 INFO  - Logging is not enabled for this container.Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2020-04-10 18:02:23.473 INFO  - Initiating warmup request to container myapp_0_138f197c for site myapp
2020-04-10 18:02:45.304 INFO  - Waiting for response to warmup request for container myapp_0_138f197c. Elapsed time = 21.8308149 sec
[...]
2020-04-10 18:06:08.252 INFO  - Waiting for response to warmup request for container myapp_0_138f197c. Elapsed time = 224.7791547 sec
2020-04-10T18:02:24.893958779Z Running in production on x64
2020-04-10T18:02:26.275376640Z Express HTTPS server listening on port 80
2020-04-10T18:02:26.601261213Z mongo :: connected to database mydb at mydb-tot7b.azure.mongodb.net
2020-04-10 18:06:14.346 ERROR - Container myapp_0_138f197c for site myapp did not start within expected time limit. Elapsed time = 230.8732099 sec
2020-04-10 18:06:14.365 ERROR - Container myapp_0_138f197c didn't respond to HTTP pings on port: 443, failing site start. See container logs for debugging.
2020-04-10 18:06:14.427 INFO  - Stoping site myapp because it failed during startup.

Почему контейнерное приложение запускается правильно, как видно из журнала azure, но контейнер не отвечает на HTTP-пинг на 443, который отображается как в dockerfile, так и в azure с помощью PORT и WEBSITES_PORT?
Нужно ли заставить мой HTTPS-сервер явно отвечать на HTTP PING и, если да, как мне это сделать?

Dockerfile:

FROM node:12

WORKDIR /usr/src/myapp

COPY package*.json ./

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

RUN npm install

COPY . .

EXPOSE 443
CMD [ "node", "app.js" ]

Возможно, эта проблема решена дубликат, но я предоставляю гораздо более актуальную информацию, по сравнению с большинством вопросов ниже. Кроме того, я потратил значительное время на устранение неполадок, и ни один из этих соответствующих ресурсов, похоже, не помог:

1 Ответ

0 голосов
/ 12 апреля 2020

При применении HTTPS на уровне службы приложений произойдет прекращение TLS, и трафик c будет перенаправлен на ваш контейнерный порт, поэтому нет необходимости применять TLS из вашего контейнера.

Если ваш контейнер прослушивает другой порт (например, 8081), просто установите для параметра WEBSITES_PORT приложения этот номер порта. Служба приложений прослушивает порт 80 и пересылает трафик c на порт контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...