我有一个运行在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
答案 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