打开Containers端口的Azure Web App?

时间:2018-06-17 06:19:22

标签: azure docker docker-compose azure-web-sites

我在Azure上的LinuxVM中运行第三方Tomcat服务器映像/容器。 LinxVM实际上是通过docker-compose脚本运行的2个映像(NGINX loadbalancer),但是为了在webapp上测试这个,我已经只对单个tomcat映像进行了测试。现在,compose脚本使用密钥:

ports:
    - 80:8090
    - 8445:8443

在VM中,我可以运行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 - &gt; Docker Compose(预览版)。我的撰写脚本看起来像:

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端口。为什么?此外,如果我尝试通过该端口访问我的网站,我无法做到。每次应用程序部署/重新启动时,它都会映射不同的外部端口。

此外,如果我追溯到“应用程序设置”&#39;并使用键/值:WEBSITES_PORT:<current externally mapped port>它几乎没有效果。然后,如果应用程序重新启动/重新部署,我可以看到WEBSITES_PORT:<port>上一个端口映射的内容,但由于这会更改每个部署,当前外部端口和{{1值永远不会匹配。我甚至都不知道它是否有效。

如何确保以确定的方式工作?如果需要,我可以提供其他材料。

1 个答案:

答案 0 :(得分:0)

这归结为将Tomcat 9.0+与Docker一起使用时的权限问题。

Permission problem while running tomcat as a non-root user

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

一旦实现了Empinator在链接中描述的修复程序,一切正常(使用root也有效)。