用于Docker容器的Web应用已启动但也超时

时间:2018-09-18 00:48:36

标签: azure docker azure-web-app-service

我有一个运行在localhost:3000上的节点应用程序,并希望公开部署它。通过在VM内运行并使用端口转发来做到这一点很容易,但是我在docker和容器部署方面苦苦挣扎。

我刚刚使用docker-compose push将新的容器映像推送到了我的私有docker存储库中,并在Azure Web应用程序中启用了持续部署。日志显示它在Web应用程序中使用docker run子命令自动按预期运行图像。

我的应用程序在容器中运行需要很长时间,并且到运行时,它已超时并且Azure似乎终止了它。

运行该应用所需的我的环境变量是在该Web应用的Azure门户内的“应用程序设置”中手动输入的。

2018_09_18_RD00155D258812_default_docker.log:
2018-09-18T00:14:27.228360304Z   level: 'info',
2018-09-18T00:14:27.228366005Z   label: 'app/server.js',
2018-09-18T00:14:27.228370005Z   timestamp: '2018-09-18T00:14:27.226Z',
2018-09-18T00:14:27.228374605Z   [Symbol(level)]: 'info' }
2018-09-18T00:14:27.844023142Z { message: 'createdQueue; results = {"name":"webhook-queue-dev","approximateMessageCount":1,"created":false}',
2018-09-18T00:14:27.844050643Z   level: 'debug',
2018-09-18T00:14:27.844055943Z   label: 'data-controllers/azure-queue.js',
2018-09-18T00:14:27.844060543Z   timestamp: '2018-09-18T00:14:27.843Z',
2018-09-18T00:14:27.844065044Z   [Symbol(level)]: 'debug' }

2018_09_18_RD00155D258812_docker.log:
2018-09-18 00:14:10.809 INFO  - Starting container for site
2018-09-18 00:14:10.809 INFO  - docker run -d -p 18365:80 --name webhook-web-app_0 -e WEBSITE_SITE_NAME=webhook-web-app -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_INSTANCE_ID=123 -e HTTP_LOGGING_ENABLED=1 jtara1/webhook  

2018-09-18 00:18:04.705 ERROR - Container webhook-web-app_0 for site webhook-web-app did not start within expected time limit. Elapsed time = 230.8677441 sec

docker-compose.yml

version: '3'

services:
  webhook:
    image: jtara1/webhook
    build:
      context: .
      dockerfile: Dockerfile
    command: node server.js
    volumes:
      - .:/app
      - /app/node_modules/
    expose:
      - "3000"
      - "80"
    ports:
      - "3000:80"

Dockerfile

FROM node:8-alpine

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

# Expose our server port.
EXPOSE 3000 80

# Run our app.
CMD ["node", "server.js"]

我使用

在localhost上测试了相同的容器映像
   $ docker-compose up -d
   $ docker-compose exec webhook sh
   > wget localhost:3000
   $ docker-compose logs
   $ docker-compose down

2 个答案:

答案 0 :(得分:2)

最后弄清楚了我在节点应用程序,docker容器和azure Web应用程序配置之间配置端口,端口转发,主机名和环境变量的问题和错误。

我没有意识到每个docker构建的标签都必须与远程docker存储库具有相同的名称。

由于上面评论中的文章中的示例,这使我意识到我的docker容器中的应用程序应该可以在同一shell env中的localhost上进行本地测试。也就是说,docker build -t jtara1/wh . id=$(docker run -p 80:3000 jtara1/wh) curl localhost应该输出“ Hello World”之类的内容,或者从根索引进行测试的应用响应中返回的任何内容。以前,我是docker exec -it $id sh(有效地远程访问我的本地容器),然后从那里的应用程序获得响应,这之后给我造成了困扰。最后,docker push jtara1/wh

我在docker日志中注意到azure使用docker通过某些端口转发(例如docker run -p 53600:80 jtara1/wh)运行docker来运行我的容器,这表明docker容器可在端口53600上访问并将该流量转发到端口80(大概是我的节点应用)。但是,我需要将环境变量PORT定义为我的节点应用使用的端口,默认为PORT = 80。 (在上面链接的文章中,建议WEBSITES_PORT是azure Web应用程序用来确定我的应用程序托管在哪个端口上的环境变量。

传统上,在Linux vm上,我托管在$ hostname -I上,并在vm的公共ip上对其进行公共访问。在我的应用中,我托管在0.0.0.0而不是通常的localhost上,因此可通过docker

访问

我一直在努力有效地管理我的应用所需的敏感环境变量(有时不是在此问题中),同时仍然试图避免在多个地方进行管理,重构或更新它们。我最终只是在网络应用程序的应用程序设置中手动输入了它们,因为目前少于18个。

我最终切换到仅使用不带docker-compose.yml的dockerfile,因为它足以完成此部署。

FROM node:8-alpine

RUN mkdir /app
WORKDIR /app

ADD package.json /app/

RUN npm install

ADD . /app/

EXPOSE 80

CMD ["node", "server.js", "--host", "0.0.0.0"]

答案 1 :(得分:1)

基于Java的Docker应用程序我也面临类似的问题。

事实证明,在Azure上,默认情况下,部署Docker容器的超时为230秒,但是可以使用键WEBSITES_CONTAINER_START_TIME_LIMIT在应用程序设置中轻松覆盖此超时。只需将其设置为更高的值,即600(= 10分钟)。请注意,最大值为1800秒。

来源:https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-faq