c# - 发布 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
解决方案
Afaik,只能在启动容器时安装卷。所以这可以使用 docker run -v 选项或在 docker compose 文件中。卷不能在 docker 文件中定义。
环境变量可以使用 ENV 指令和/或 docker run 命令在 docker 文件中定义。
推荐阅读
- ios - 如何使用 Playground 获取创建的 mlmodel 的边界框数据
- c - 自定义 Windows 身份验证包
- android - UserVisibilityHint 函数在 Fragmnent 可行时不会每次都被调用
- mysql - 列出 MySQL 中所有具有 DML 权限的用户
- android - 在 AOSP 中运行本地单元测试(Junit 和 Mockito)
- angular - 如何在角度 6 中集成数据表
- symfony - 通过 FOSUserBundle 使用两个实体时按用户名或电子邮件记录
- laravel - 如何在 Laravel 5.6 中下载印地语的 pdf
- ibm-mobilefirst - 无法从远程机器连接到 IBM Mobile first 7.1 服务器
- android - 与相对布局一起使用时,导航抽屉不起作用