用于身份验证的自定义Docker映像和Azure CLI基础

用于身份验证的自定义Docker映像和Azure CLI基础,docker,docker-compose,azure-devops,dockerfile,containers,Docker,Docker Compose,Azure Devops,Dockerfile,Containers,我正在构建一个.NET核心应用程序,我希望通过Azure Devops构建管道进行部署。管道将使用Docker容器构建、测试和部署 我已使用以下Dockerfile为我的应用程序成功构建了第一个docker映像,现在正在尝试在本地计算机上运行它,然后将其用于管道: FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env MAINTAINER yummylumpkins <yummy@lumpkins.com> WORKDIR /

我正在构建一个.NET核心应用程序,我希望通过Azure Devops构建管道进行部署。管道将使用Docker容器构建、测试和部署

我已使用以下
Dockerfile
为我的应用程序成功构建了第一个docker映像,现在正在尝试在本地计算机上运行它,然后将其用于管道:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
MAINTAINER yummylumpkins <yummy@lumpkins.com>
WORKDIR /app

COPY . ./
RUN dotnet publish MyAPIApp -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .

ENTRYPOINT ["dotnet", "MyAPIApp.dll"]
在做了大量研究(并在这里得到了一些积极的反馈)之后,授权本地运行的docker容器的最佳方法似乎是在Microsoft的Azure CLI基础映像之上构建映像,然后在构建/运行过程中的某个地方使用
az login--service principal-u-p--tenant
来授权本地docker容器

我已成功从Microsoft中提取Azure CLI映像(
docker pull mcr.Microsoft.com/Azure CLI
),并可以通过
docker run-it mcr.Microsoft.com/Azure CLI运行它。该容器使用Azure CLI命令行运行,我可以通过bash登录,但这就是我所做的

下一步是在映像构建期间将此Azure CLI映像分层到我以前的Dockerfile中,但我不确定是否要这样做。我尝试了以下方法:

# New base image is now Azure CLI
FROM mcr.microsoft.com/azure-cli
RUN az login -u yummylumpkins -p yummylumpkinspassword

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
MAINTAINER yummylumpkins <yummy@lumpkins.com>
WORKDIR /app

COPY . ./
RUN dotnet publish MyAPIApp -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .

ENTRYPOINT ["dotnet", "MyAPIApp.dll"]
#新的基本映像现在是Azure CLI
来自mcr.microsoft.com/azure-cli
运行az登录-u yummylumpkins-p yummylumpkins密码
来自mcr.microsoft.com/dotnet/core/sdk:3.1 AS build env
维护者yummylumpkins
WORKDIR/app
复制/
运行dotnet publish MyAPIApp-c Release-o out
来自mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR/app
复制--from=build env/app/out。
入口点[“dotnet”,“MyAPIApp.dll”]
但这仍然不起作用,该过程仍然会导致上述相同的错误(我想这是因为在添加新的
dotnet core
层时登录不会持久。我的问题是,如何使用
Azure login
命令将Azure CLI映像显式构建到docker文件/映像构建过程中,以授权docker容器,持久化授权,然后设置一个命令来运行应用程序(MyAPIApp.dll)是否具有持久授权


或者,我是否采取了完全错误的方法?提前感谢您的反馈。

在此处发布更新并给出答案,以防其他人有类似问题。我还没有找到任何其他解决方案,因此我必须自己制作。下面是我的Dockerfile。现在图像的大小为1GB,因此我肯定需要要完成并优化,但我将解释我所做的:

#1 Install .NET Core SDK Build Environment
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

#2 Build YummyApp
COPY . ./
RUN dotnet publish YummyAppAPI -c Release -o out

#3 Install Ubuntu Base Image
FROM ubuntu:latest
MAINTAINER yummylumpkins <yummy@lumpkins.com>
WORKDIR /app
ENV ASPNETCORE_URLS=http://+:80
EXPOSE 80

#4 Install package dependencies & .NET Core SDK
RUN apt-get update \
    && apt-get install apt-transport-https \
    && apt-get update \
    && apt-get install -y curl bash dos2unix wget dpkg \
    && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
    && dpkg -i packages-microsoft-prod.deb \
    && apt-get install -y software-properties-common \
    && apt-get update \
    && add-apt-repository universe \
    && apt-get update \
    && apt-get install apt-transport-https \
    && apt-get update \
    && apt-get install -y dotnet-sdk-3.1 \
    && apt-get update \
    && rm packages-microsoft-prod.deb

#5 Copy project files from earlier SDK build
COPY --from=build-env /app/out .

#6 Install Azure CLI for AppAuthorization
RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash

#7 Login to Azure Services and run application
COPY entrypoint.sh ./
RUN dos2unix entrypoint.sh && chmod +x entrypoint.sh
CMD ["/app/entrypoint.sh"]

复制完所有内容后,我们将构建/发布应用程序的发布配置

第3步-安装Ubuntu基本映像:我们使用Ubuntu启动了一个新的层。我最初尝试使用Alpine Linux,但发现如果不进行一些真正的黑客操作,几乎不可能在其上安装Azure CLI,因此为了安装的方便,我选择了使用Ubuntu

第4步-安装包依赖项和.NET Core SDK:在Ubuntu层中,我们设置了工作目录,并安装/更新了一系列库,包括.NET Core SDK。应该注意的是,我需要安装
dos2unix
,以便稍后运行shell脚本文件…我将在后面解释

注意:我最初尝试安装.NET Core Runtime只是因为它更轻量级,并且会将此映像降低到大约700MB(从1GB),但由于某种原因,当我尝试在文件末尾运行应用程序(步骤7)时,我收到一个错误,说找不到运行时。因此我返回SDK

第5步-从早期SDK构建复制项目文件:为了节省空间,我将构建的项目文件从第一个“构建映像”复制到这个Ubuntu层,以节省一些空间(大约1GB)

步骤6-安装Azure CLI:为了授权我的应用程序从Azure服务获取令牌,通常我使用
Microsoft.Azure.Services.AppAuthentication
。此软件包提供了一个名为
AzureServiceTokenProvider()
的方法(通过我的IDE)授权我的应用程序连接到Azure服务以获取令牌,然后该令牌用于访问Azure密钥保管库。这整个问题都是因为我的应用程序无法从docker容器中执行此操作,因为Azure无法识别来自容器本身的请求

因此,为了解决这个问题,我们需要在启动应用程序之前,通过Azure CLI中容器内的
az login
登录

第7步-登录Azure服务并运行应用程序:现在是展示时间。我在这里要解决两个不同的问题。我必须弄清楚如何在启动此容器时执行
az-Login
dotnet-YummyAppAPI.dll
。但是Dockerfiles只允许一个
ENTRYPOINT
CMD
>通过创建一个shell脚本文件(entrypoint.sh),我能够将这两个命令都放到这个文件中,然后执行那个文件

设置此项后,我在
entrypoint.sh
中遇到一个错误,该错误如下:
entrypoint.sh:在$PATH
中找不到可执行文件。我发现我必须使用
chmod
更改此文件的权限,否则,我的docker容器无法访问它。这使得le可见,但文件仍无法执行。我收到另一个错误:
Standard\u init\u linux.go:211:exec用户进程导致“没有这样的文件或目录”

经过进一步挖掘,当您尝试在基于Linux的系统上使用Windows中创建的.sh文件时,就会出现此问题。因此,我必须安装
dos2unix
,以将此文件转换为与Linux兼容的文件。我还必须确保该文件的格式正确。总之
#1 Install .NET Core SDK Build Environment
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

#2 Build YummyApp
COPY . ./
RUN dotnet publish YummyAppAPI -c Release -o out

#3 Install Ubuntu Base Image
FROM ubuntu:latest
MAINTAINER yummylumpkins <yummy@lumpkins.com>
WORKDIR /app
ENV ASPNETCORE_URLS=http://+:80
EXPOSE 80

#4 Install package dependencies & .NET Core SDK
RUN apt-get update \
    && apt-get install apt-transport-https \
    && apt-get update \
    && apt-get install -y curl bash dos2unix wget dpkg \
    && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
    && dpkg -i packages-microsoft-prod.deb \
    && apt-get install -y software-properties-common \
    && apt-get update \
    && add-apt-repository universe \
    && apt-get update \
    && apt-get install apt-transport-https \
    && apt-get update \
    && apt-get install -y dotnet-sdk-3.1 \
    && apt-get update \
    && rm packages-microsoft-prod.deb

#5 Copy project files from earlier SDK build
COPY --from=build-env /app/out .

#6 Install Azure CLI for AppAuthorization
RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash

#7 Login to Azure Services and run application
COPY entrypoint.sh ./
RUN dos2unix entrypoint.sh && chmod +x entrypoint.sh
CMD ["/app/entrypoint.sh"]

[YummyApp]
  |-YummyAppDataAccess
     |YummyAppDataAccess.csproj
  |-YummyAppInfrastructure
     |YummyAppInfrastructure.csproj
  |-YummyAppAPI
    |-YummyAppAPI.csproj
  |-YummyAppServices
    |-YummyAppServices.csproj
  |-YummyApp.sln

#!/bin/sh
set -e

az login -u yummy@lumpkins.com -p ItsAlwaysYummy
dotnet /app/YummyAppAPI.dll

exec "$@"