首页 > 解决方案 > 打开 Azure Web App for Containers 端口?

问题描述

我有一个在 Azure 上的 LinuxVM 中运行的第 3 方 Tomcat 服务器映像/容器。LinxVM 实际上是作为通过 docker-compose 脚本运行的 2 个图像(NGINX 负载均衡器)开始的,但是为了在 web 应用程序上测试它,我只需要一个 tomcat 图像。现在,撰写脚本使用密钥:

ports:
    - 80:8090
    - 8445:8443

在虚拟机中,我可以运行 docker-compose 脚本并点击http://mypage:80它,它工作得很好。我也可以运行:

docker run -d -p <somePort>:8090 --name tomcat_1 <myrepo/myimage>

http://mypage:<somePort>然后,无论我想将哪个端口映射到容器,我都可以访问我的站点。这一切都很好。

现在,通过 Azure Web App,我正在使用 Azure Web App for Containers --> Docker Compose (Preview)。我的撰写脚本看起来像:

version: "3.0"
services:
    pdfd-tomcat:
            image: <myrepo/myimage>
            build:
                context: .
                args:
                    INCLUDE_DEMO: 'true'
                    LIBRE_SUPPORT: 'false'
                    HTML_SUPPORT: 'false'
            container_name: Blackbox
            environment:
                TRN_PDFNET_KEY:
                TRN_DB_TYPE: SQLITE
                TRN_DB_LINK:
                TRN_BALANCER_COOKIE_NAME: HAPROXID
                TRN_DEBUG_MODE: 'false'
            ports:
                - 80:8090
                - 8445:8443

我已经公开了 80:8090,因为我读过 Azure Web Apps 默认只公开端口 80 和 443。但是,一旦 Web 应用程序启动,我就无法从任何端口访问该站点。我已经验证在 VM 中运行相同的撰写脚本有效。现在,当我点击网络应用程序日志时,我看到了:

Status: Image is up to date for <myrepo/myimage>

2018-06-17 05:38:41.298 INFO  - Starting container for site
2018-06-17 05:38:41.298 INFO  - docker run -d -p 18455:8090 --name tomcat_1 -e WEBSITE_SITE_NAME=<mywebsite> -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_INSTANCE_ID=<stuff goes here>

2018-06-17 05:38:41.298 INFO  - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2018-06-17 05:38:56.994 INFO  - Started multi-container app
2018-06-17 05:38:57.008 INFO  - Container tomcat_1 for site <mywebsite> initialized successfully.

因此,它似乎正在尝试将外部端口:18455 映射到我的内部 8090 端口。为什么?此外,如果我尝试通过该端口访问我的网站,我不能。每次应用程序部署/重新启动时,它都会映射一个不同的外部端口。

此外,如果我追溯地转到“应用程序设置”并使用键/值:WEBSITES_PORT:<current externally mapped port>它实际上没有任何效果。然后,如果应用程序重新启动/重新部署,我可以看到这WEBSITES_PORT:<port>以前的端口映射的,但由于每次部署都会改变,当前的外部端口和WEBSITES_PORT值永远不会匹配。我什至不知道它是否有效。

到底是如何让它以一种确定的方式工作的呢?如果需要,我可以提供其他材料。

标签: azuredockerdocker-composeazure-web-app-service

解决方案


当使用 Tomcat 9.0+ 和 Docker 时,这归结为权限问题。

以非root用户运行tomcat时的权限问题

Dockerfile 将创建一个新的用户组并添加一个用户,然后在 Tomcat 所在的文件夹中授予该用户权限。如果您通过跳入容器docker exec /bin/bash并检查权限,它们看起来都很好。但是,日志会显示 Tomcat 无法访问这些文件夹。

一旦我按照 Empinator 在链接中描述的那样实施了修复,一切正常(使用 root 也可以)。


推荐阅读