发布一个包含VS2017机密的单一Image Docker容器并在Azure上运行它

(事先书面,但在5月2日相关文章最终出版时出版。)

我刚刚完成了一个由三部分组成的系列文章,内容是构建一个容器化的ASP.NET核心API,该API使用EF核心进行数据持久化。所有这些都是在vs 2017中完成的,我利用了docker的vs2017工具。

该系列文章将于今年4月出版。5月和6月出版的《MSDN杂志》。

第1部分:码头集装箱化应用程序中的ef核心,APR 2019

第2部分:码头集装箱化应用程序中的ef核心,2019年5月

但是我没有足够的空间来包含部署我写的应用程序的重要任务,尽管我努力工作。好,部署非常简单,但是需要执行一些新步骤来处理存储密码,以便连接到我的Azure SQL数据库。我将在这篇博文中转达这些步骤。

我的API使用EF核心并以一个Azure SQL数据库为目标。所以不管我是在本地用IIS还是Kestrel调试,在Docker容器内进行本地调试或从服务器或云运行应用程序,我总能访问那个数据库。

这意味着我有一个要处理的连接字符串,但我想对密码保密。

解决方案的结构在这里。My ASP.NET Core API project is DataAPIDocker.因为我使用Docker工具添加容器编排,我在解决方案中还有一个文件夹用于Docker Compose。

图像

我将在本文的第2部分(2019年5月的一期)中详细介绍,但底线是在docker-compose.yml文件中使用docker环境变量。

版本:“3.4”

服务:
dataapidocker:
图片:$Docker_Registry-DataApidocker
建造:
语境:
dockerfile:dataapidocker/dockerfile
环境:
-布兰达

在环境映射中,我有一个序列项,其中定义了DB_PW键,但没有包含值。因为那里没有价值,Docker将查看主机的环境变量。因为我只是在调试,我在我的系统上创建了一个临时环境变量,其值为密码,当我调试或运行VS2017的应用程序时,将找到password变量。该环境变量被传递到正在运行的容器中,我的应用程序具有读取该变量的代码,并将该密码包含在连接字符串中。

所以它是独立的,漂亮和整洁。

将映像发布到Azure的ACI注册表

一旦你的应用程序运行,是时候发布它了。但我们用的是Docker,所以你不发布应用程序,但可以为你运行应用程序的Docker图像。Docker工具也将在这方面提供帮助。

右键单击项目并选择Publish。

图像

然后您将要创建发布配置文件。这个配置文件的一部分是选择发布图像的位置。这里你有很多选择。我有一个Visual Studio订阅,如果我想要,可以将它发布到一个Azure容器注册表,或者发布到Docker Hub或其他注册表。

图像

我这篇博客文章的目标是将图像放到Azure容器注册表中,所以这是我的选择。您的Azure帐户中可以有多个容器注册。您可以在一个注册表中存储任意数量的图像。好,可能存在技术或财务限制,但问题是,注册表中可以有多个图像。我在这里不是要就如何管理azure财务提供建议,如何完成任务。

这是我让发布工具为我创建的注册表的概述页面。我圈出了链接,以查看可以访问您的图像的存储库。

图像

你可能有一个特定图像的不同版本所以每个"set"是不同的存储库。我有三个储存库,我一直在试验。

图像

dataapi只有一个图像,发布工具自动将其标记为“最新”为了我。我可以在不同的标签下有其他版本。

回到Visual Studio,在浏览了发布工具关于创建新存储库的问题之后,最后一步是进行发布,发布将构建图像并将其推送到目标存储库。请记住,您希望将VS2017设置为运行版本构建,不是调试构建。

如果这是您第一次将此图像推送到存储库,the tooling will also push the ASP.NET Core SDK and runtime images that are listed in the app's Dockerfile .

看到这个我很惊讶,想知道为什么Azure不只是从Docker Hub上获取它们,为什么我要直接上传那些大文件。我很自然地在推特上表达了我的困惑:

故事还有很多,但它超出了我在这里的目标范围。

这个注册表的一个很酷的功能是您可以右键单击并运行一个图像。如果您没有试图编排大量的图像,并且这与我的情况相匹配,那么这是可以的。此图像确实独立运行。

右键单击图像并选择Run instance。Azure将创建一个容器并将其作为Azure容器实例.尽管首先需要为实例定义规范。

图像

这有点不可思议,因为如果容器是一个简单的应用程序,您不必创建和管理一个虚拟机来运行它。

容器实例的环境变量如何?

该实例将运行,但需要从Azure SQL数据库中读取的杂志控制器将失败,因为我们没有提供容器希望通过主机的环境变量提供的密码。所以为了我的形象,右键单击并运行还不够。

在这里我要读很多书,研究和实验,直到我找到解决方案。(请记住,如果我在自己设计的虚拟机上运行此程序,当您手动调用docker run时,只需传入变量即可。)

有两种方法可以为容器实例提供环境变量。

一,通过入口,意思是不要右键点击图片,您需要首先在Azure中创建一个新的容器实例并指向该映像。该路径允许您在配置中分配最多3个环境变量:
图像

使用动态变量传递到容器中

我将进行第一次传递,创建一个动态变量以传递给environmentvariable。然后我会教你如何使用Azure密钥库

environmentvariable需要哈希表。

创建一个新的变量(我将称之为envvars,以纪念我学习到的资源),并分配一个键值对:

$envvars=@'db_pw'='eiluj'

另一个棘手的部分是提供访问注册表中映像的凭据。在使用门户创建容器时,我们不必这样做,因为我们已经提供了它们。但现在我需要提供它们。

您需要存储库中的用户名和密码:

然后,可以使用PowerShell根据密码创建安全字符串,然后使用该安全字符串和用户名创建PowerShell凭据对象。

提示:如果您有多个订阅,确保指向的是目标资源组所在的位置。

提示:在云shell中可以做的一件很酷的事情是,键入dir列出您的订阅,然后使用cd进入正确的订阅!结帐PowerShell Cloud Shell快速启动详情

.

小贴士:如果像我一样,你摆弄数据库来体验因果关系,记住在我的示例代码中,在应用程序启动时迁移数据库。在容器中包含它的情况下,这意味着当容器实例运行时。所以如果你运行容器,然后删除数据库,在容器再次旋转之前,不会再次看到db。停止和重新启动具有相同的效果。当然,这只是为了测试一下,不生产!再一次,有件事让我坚持了一个多小时,直到我灵光一闪。

创建密钥库并添加我的秘密密码

报名参加我的时事通讯所以你不要错过我的会议和多元化课程公告!

留下一个回复

您的电子邮件地址将不会发布。已标记必需字段*

这个站点使用Akismet来减少垃圾邮件。了解如何处理评论数据.