首页 > 解决方案 > 发布 docker 映像时的构建选项问题

问题描述

Visual Studio 在构建/运行时使用大量命令行参数运行 docker。因此,在调试和发布模式下点击运行可以毫无问题地启动容器。

如何使 docker 文件具有所有挂载和环境变量,以便在将容器发布到容器注册表/存储库时不必提供任何这些?

我的码头文件看起来像:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["Service/Service.csproj", "Service/"]
COPY ["DataLayer/DataLayer.csproj", "DataLayer/"]
RUN dotnet restore "Service/Service.csproj"
COPY . .
WORKDIR "/src/Service"
RUN dotnet build "Service.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Service.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Service.dll"]

在 Visual Studio 中按下 Run docker 后,它会使用以下命令启动映像: 在这里您可以看到 Visual Studio 提供的用于运行容器的所有 cmd 选项

docker build -f "C:\Users\Jacob\source\repos\Service\Dockerfile" --force-rm -t service  --label "com.microsoft.created-by=visual-studio" --label "com.microsoft.visual-studio.project-name=Service" "C:\Users\Jacob\source\repos\Service"
docker run -dt -v "C:\Users\Jacob\vsdbg\vs2017u5:/remote_debugger:rw" -v "C:\Users\Jacob\AppData\Roaming\Microsoft\UserSecrets:/root/.microsoft/usersecrets:ro" -v "C:\Users\Jacob\AppData\Roaming\ASP.NET\Https:/root/.aspnet/https:ro" -e "ASPNETCORE_URLS=https://+:443;http://+:80" -e "ASPNETCORE_HTTPS_PORT=443" -e "ASPNETCORE_ENVIRONMENT=Development" -e "ASPNETCORE_LOGGING__CONSOLE__DISABLECOLORS=true" -p 80:80 -p 443:443 -P --name Service --entrypoint tail service -f /dev/null

当我只是在没有所有这些 cmd 行选项的情况下将容器托管在某个地方时,它不会让所有的挂载和命令行参数起作用。我假设所有这些都必须在发布时包含在我的 dockerfile 中?那么我该如何设置所有这些呢?

作为参考,这是 docker hub 提供的关于检查容器的信息:

Environment
ASPNETCORE_URLS
https://+:443;http://+:80

ASPNETCORE_HTTPS_PORT
443

ASPNETCORE_ENVIRONMENT
Development

ASPNETCORE_LOGGING__CONSOLE__DISABLECOLORS
true

PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

DOTNET_RUNNING_IN_CONTAINER
true

DOTNET_VERSION
5.0.2

ASPNET_VERSION
5.0.2

Mounts
/REMOTE_DEBUGGER
C:\Users\Jacob\vsdbg\vs2017u5

/ROOT/.MICROSOFT/USERSECRETS
C:\Users\Jacob\AppData\Roaming\Microsoft\UserSecrets

/ROOT/.ASPNET/HTTPS
C:\Users\Jacob\AppData\Roaming\ASP.NET\Https

Ports
443/tcp
localhost:443

80/tcp
localhost:80

但是当我自己运行已发布的 docker 映像时:

Environment
PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

ASPNETCORE_URLS
http://+:80

DOTNET_RUNNING_IN_CONTAINER
true

DOTNET_VERSION
5.0.2

ASPNET_VERSION
5.0.2

Ports
443/tcp
localhost:443

80/tcp
localhost:80

标签: c#asp.netvisual-studiodocker

解决方案


Afaik,只能在启动容器时安装卷。所以这可以使用 docker run -v 选项或在 docker compose 文件中。卷不能在 docker 文件中定义。

环境变量可以使用 ENV 指令和/或 docker run 命令在 docker 文件中定义。


推荐阅读