问题标签 [azure-web-app-for-containers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
379 浏览

docker - Azure DevOps CI 与容器的 Web 应用程序

我正在努力为 Azure 中的 Web 应用程序设置 CI 流程。我习惯于将构建的代码直接部署到 Azure 中的 Web 应用程序中,但这次决定使用 docker。

在构建管道中,我构建 docker 映像并将它们推送到 Azure 容器注册表,并标记最新的内部版本号。在发布管道(包含 DEV、TEST 和 PROD)中,我需要将这些图像部署到每个环境的 Web 应用程序中。Azure 版本中有 2 个相关任务可用:“Azure App Service deploy”和“Azure Web App for Containers”。这些都不允许将 Web 应用的图像源设置为 Azure 容器注册表。相反,他们采用自定义注册表/存储库名称并将 Web 应用程序中的图像源设置为私有注册表,然后需要登录名和密码。我还使用 ARM 模板部署所有 Azure 资源,因此我不喜欢在 2 个资源(注册表和 Web 应用程序)已经集成时配置凭据的想法。理想情况下,我将能够将 Web 应用程序设置为使用我在发布中指定的 Azure 容器注册表中的存储库和标记。我什至尝试首先使用特定的存储库和标签手动配置 Web 应用程序,然后尝试在发布时更改 Web 应用程序使用的标签(使用我提到的任务),但它不起作用。标签保持不变。

我考虑的另一个选择是从一开始就将所有 Web 应用程序配置为特定和永久的存储库和标签(例如“dev-latest”)(这不适合 ARM 部署,因为容器需要在 Web 之前存在于注册表中可以配置应用程序,因此我的基础设施自动化是不完整的),在 Web 应用程序中启用“持续部署”,然后在发布中相应地标记最新推送的存储库,以便它们将被 Web 应用程序拾取。我找不到将标签添加到注册表中现有存储库的合理方法。

使用容器化 Web 应用程序进行 CI 的 Azure 最佳实践是什么?人们如何实际构建他们的容器,然后将它们部署到每个环境中?

0 投票
1 回答
800 浏览

docker-compose - 如何使用 docker compose 在容器的 Azure Web 应用程序上托管多个站点

我想使用 docker compose 文件为我们的 Linux 托管站点部署多个公共端点。

我们已经部署了一个站点,该站点将图像存储在私有 ACR 上,并托管在 Azure App Service 上(使用 Web App for Containers)。它通过 Azure DevOps 部署并且运行良好。

然而,我们希望使用同一个站点来托管一个额外的组件,一个 api,以便我们最终得到这些端点:

如果可能,我们希望避免使用第二个应用服务或子域。我们更喜欢的架构是使用相同的 https 证书和端口(443)来托管 api。该网站和 api 共享一个相似的代码库。

在标准的应用服务世界中,我们可以很容易地为主应用部署一个虚拟目录,这很简单。

这个模型虽然在使用容器时似乎更复杂。

我们该怎么做呢?我已经看过这个文档:https ://docs.microsoft.com/en-us/azure/app-service/containers/tutorial-multi-container-app 。然而,在这个例子中,第二个容器是一个私有容器——它不会被暴露。

我们是否应该使用 docker compose 文件(请提供示例)?或者,有没有一种方法可以使用 Azure DevOps 任务以我想要的方式部署到虚拟目录。这是我们用于单容器部署的任务:

https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-rm-web-app-containers?view=azure-devops

0 投票
0 回答
205 浏览

sonarqube - Sonarqube docker image 8.2 在由 azure sql 支持的 azure web 应用程序中失败

托管:Azure Web Apps Container using sonarqube docker image 8.2 community 数据库:Azure SQL

问题: 当我尝试配置 docker 8.2 社区版时,我收到“没有响应端口:9000 上的 HTTP ping,站点启动失败”。但是,当我使用 docker 7.1 映像时,一切都像具有相同数据库和环境配置的魅力。

8.2 社区 docker 镜像与“嵌入式数据库”一起使用。为此,为了工作,我需要从 Web 应用程序的 appsettings 中删除下面提到的所有设置,但我不能将嵌入式数据库用于生产。

Web App 容器 Appsetting: SONARQUBE_JDBC_URL: jdbc:sqlserver://xxx-sql.xxx.mock.net:1433;databaseName=sonar;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30; SONARQUBE_JDBC_USERNAME:用户名 SONARQUBE_JDBC_PASSWORD:密码

日志: 2020-04-18T07:22:00.087917276Z 错误:[1] 引导检查失败 2020-04-18T07:22:00.088256776Z [1]:最大虚拟内存区域 vm.max_map_count [65530] 太低,增加到至少 [262144]

2020-04-18 07:21:06.713 信息 - 站点的启动容器 2020-04-18 07:21:06.714 信息 - docker run -d -p 1345:9000 --name sonarapp_0_338a176e -e WEBSITE_SITE_NAME=sonarapp -e WEBSITE_AUTH_ENABLED=假 -e PORT=9000 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=xxx.mywebsites.net -e WEBSITE_INSTANCE_ID=c5ca023cf00c345rft6fder34sdeb31ebeba5d4ab2694580a387d9fd4508b6a79 sonarqube:8.2-commun

2020-04-18 07:21:08.556 信息 - 向容器 sonarapp_0_338a176e 发起站点 sonarapp 的预热请求 2020-04-18 07:21:25.891 信息 - 等待对容器 sonarapp_0_338a176e 的预热请求的响应。经过时间 = 17.3347129 秒 2020-04-18 07:22:01.392 错误 - 站点 sonarapp 的容器 sonarapp_0_338a176e 已退出,站点启动失败 2020-04-18 07:22:01.414 错误 - 容器 sonarapp_0_338a176e 未响应 HTTP pings on端口:9000,站点启动失败。请参阅容器日志以进行调试。2020-04-18 07:22:01.500 信息 - 停止站点 sonarapp,因为它在启动期间失败。

0 投票
1 回答
330 浏览

azure - 在 Azure Web App for Containers 上运行 Rasa bot

我正在尝试让 Rasa 默认机器人在 Azure Web App for Containers 中运行,但出现以下错误:

这是我的 Dockerfile:

知道端口问题可能来自哪里吗?我应该启用容器日志吗?

0 投票
1 回答
875 浏览

azure - Azure Web App 的 Azure 容器注册表授权

有没有一种方法可以从 Azure 容器注册表中提取图像而无需使用以下应用设置?

DOCKER_REGISTRY_SERVER_URL DOCKER_REGISTRY_SERVER_PASSWORD

我尝试为我的应用服务提供适当的 RBAC,并使用 Azure Web App on Container Deploy DevOps 任务,但这不起作用。

目前,我使用管理员用户/密码为 CD 设置了它,但这不是我想投入生产的选项。

我得到的错误信息(当我没有设置 DOCKER_REGISTRY_SERVER_URL 和 DOCKER_REGISTRY_SERVER_PASSWORD 时):

2020-06-18T11:01:51.313Z 信息 - 从 Docker 中心拉取图像:xx.azurecr.io/xx:xx

2020-06-18T11:01:51.545Z 错误 - DockerApiException: Docker API 响应状态码=InternalServerError, response={"message":"Get https://xx.azurecr.io/v2/xx/manifests/xx:未经授权:需要身份验证"}

2020-06-18T11:01:51.553Z 错误 - 图像拉取失败:验证 docker 图像配置和凭据(如果使用私有存储库)

0 投票
1 回答
146 浏览

azure - 用于容器的 Azure Web 应用程序的暂存槽仅在生产层中可用 - 非常昂贵

我一直在使用 Docker 和 Azure Web Apps for Containers 使用 Python Api 开发 React SPA。

现在,当我想开发生产部署过程时,我发现除了非常昂贵的生产层之外,没有包含插槽的应用服务层。

我弄错了吗?

如果没有,这有什么原因吗?

0 投票
1 回答
95 浏览

azure - Azure WebApp 多容器配置已损坏

更改代码后,我们的网络应用程序出现故障。检查显示这似乎是由无效的 docker compose 定义引起的,该定义位于单独的存储库中,不受此更改的影响。当我查看门户中的配置时,我看到一个乱码/损坏的 docker compose 文件。触发发布并未解决问题。修改 docker compose 文件(添加一个虚拟 env var,以确保它具有不同的哈希值)并没有解决问题。撰写文件使用 UTF-8 编码。

我尝试使用az webapp config container show --resource-group [RG]--name [NAME] --slot [SLOT]. 这给了我一个以“COMPOSE|”开头的环境变量“DOCKER_CUSTOM_IMAGE_NAME” 和后面的base64字符串。

当我尝试解码此字符串时,输出也已损坏。

我尝试切换到单个容器图像。这表明 env var 是“DOCKER|[image-name]”。之后触发释放会导致输出再次损坏。

这个问题似乎类似于这里描述的问题https://developercommunity.visualstudio.com/content/problem/1096679/compose-file-corrupted-in-release-task.html

有没有其他人遇到过这个错误?如果是这样,您是如何解决的?

0 投票
1 回答
425 浏览

r - 将引用的参数传递给容器的 azure webapp --startup-file

对于容器的 Azure Web 应用程序,我需要传递一个带引号的az webapp config set --startup-file. 例如,参数需要包含空格

TL; 博士

  • 这真的应该有效,因为--startup-file只是被附加到docker run一个 docker[COMMAND]上。
  • 奇怪的是,嵌套引用(ie --startup-file "Rscript -e '1+1'") 会导致内部引号的奇怪引号(R 将 接收[EXPR]为 string [1] "1+1")。
  • 任何带有空格的东西,无论是否引用,都会被分解Rscript(或docker run?)的单独参数,因此会失败。

我不清楚在后端使用 引用 Azure 做了什么--startup-file,因为记录docker run的 s 看起来都很好。一方面,Azure 似乎引用了太多(导致字符串),但另一方面又不够(因为空格仍然会破坏内容)。


背景

我假设它实际上--startup-file 可以容纳任意 shell 命令(不仅仅是可执行文件),因为:

  1. 它被不同地描述为“启动命令”和“启动文件portal.azure.com
  2. 根据日志,它只是被附加到docker runas[COMMAND]并且因此应该遵守相同的语义。
  3. 有效(除非有空格)。

我知道潜在的问题是 shell 参数是空格分隔的,但是,如下所示,简单"地不要这样做。

我在Rscript -e "1 + 1"这里用作示例是因为 a) R 是我的用例 b) 很容易看出哪里出了问题。 Rscript是批处理 R 的二进制文件,语义类似于sh -c "pwd;ls". 我猜测可以为sh -c-type 启动文件编写类似的可重现示例。

下面的示例都不会启动 http 服务器,因此会失败az webapp restart,但是启用容器日志记录后,很容易看出已经出了什么问题。(实际用例是Rscript -e "shiny::runApp()"启动一个http 服务器。)

基线

作为基线,这是对应的docker run,它在本地工作得很好(macOS 10.15.6,Docker 版本 19.03.12,构建 48a66213fe):

嵌套报价

根据 Azure 日志,上述各项的对应docker run内容类似于:

(我已经放弃了一些-e)。如前所述,这是一个有效的docker run调用。如果在本地运行(见上文),它会按预期产生:

但在 Azure 上,您将参数作为 R 中的字符串获取,如下所示,每个变体

这很奇怪,因为它表明 azure 以某种方式用另一组引号包围了这个论点。要在本地重现它,您需要运行

显然不是我想要的,以及(我认为?)无证的天蓝色行为。

没有引号,没有空格(有效!)

果然,传递不带引号(和空格)的参数是有效的:

产量[1] 8

这并不奇怪,因为两者

  • docker run rstudio/r-base:4.0.2-xenial Rscript -e "1+1"
  • docker run rstudio/r-base:4.0.2-xenial Rscript -e 1+1工作,

因为-e [EXPR]这里不需要习惯性的引用。

但是不使用空格虽然在技术上是可行的,但并不是真正的解决方案。

空格,无引号(损坏)

正如预期的那样,仅[1] 1在 Azure 上产生,因为docker run会将之后的所有内容1视为单独的参数,因此忽略它。

空格,各种引用(全部损坏)

所以,没问题,有人可能会想,我会再逃避一些。

这些,以及他们悲伤的朋友,都屈服了:

这有点奇怪,因为这意味着R 代码的一部分(直到并包括+)使得它,虽然不是关键的5.

我能想到重现这一点的唯一方法是运行


这里发生了什么?

我绝对不能对 Azure 在这里所做的任何引用/转义做出正面或反面。我要么非常非常密集(可能),要么 Azure 做了一些非常奇怪和无证的事情(可能吗?)。

如何将带有空格的参数作为 a--startup-file传递给 Azure?

Ps.:我知道我可以通过CMD在 my 中添加相应的指令Dockerfile--startup-file留空来避免所有这些恶作剧,但是 a) 对于简单的选项来说这会很麻烦 b) 它必须是可能的

0 投票
1 回答
435 浏览

azure - 从 Docker 容器在 Azure App Service Linux 主机上持久保存 Strapi SQLite 数据库

我正在尝试从 docker 容器将 Strapi SQLite 数据库持久保存在 Azure App Service Linux 主机上。

我尝试使用以下两种方法:

  1. https://docs.microsoft.com/en-us/azure/app-service/configure-custom-container#use-persistent-shared-storage
  2. https://docs.microsoft.com/en-us/azure/app-service/configure-connect-to-azure-storage?pivots=container-linux

两者都导致以下错误:

这是我的docker-compose.yml

0 投票
1 回答
744 浏览

azure - 如何在 webapp 中为 azure 中的容器公开两个端口?

容器的 web-app 是否支持公开多个端口。例如,我的 docker 映像使用两个端口,但在容器的 web-app 中,我只能使用一个端口,要么是端口 80,要么是应用程序设置中 WEBSITES_PORT 指定的端口。 链接到类似的问题,但已经有很长时间了,所以目前有任何方法可以在 Web-app 上为容器公开多个端口。

无法使用 azure 容器实例(它公开多个端口),因为它不提供 SSL。