避免重复的 Dockerfile

mu8*_*u88 1 c# raspberry-pi docker .net-core asp.net-core

我正在开发一个通过 Docker 提供的 .NET Core 应用程序。我的开发环境是一台使用 Linux 容器的 Windows 机器。生产环境是树莓派。

由于开发和生产之间的架构不同(x64vs. ARM),我有两个不同的 Dockerfile,它们仅在一行(基本映像)上有所不同:

  • 开发时间x64FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
  • 生产时间ARMFROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim-arm32v7 AS base

是否可以避免两个不同的文件?如果是,我该怎么做?是否有可能有类似的东西,if或者我可以引用另一个文件(例如Dockerfile.common)?

Dav*_*aze 5

对于像这样的简单字符串替换,您可以使用 Dockerfile ARG。如果您使用它来设置FROM基本图像,则需要在任何FROM行之前指定它。(对于其他用途,需要FROM在需要它的每个图像阶段中的行之后指定。)

ARG BASE_IMAGE=mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
FROM ${BASE_IMAGE} AS base
Run Code Online (Sandbox Code Playgroud)

如果您在 ARM 上构建,那么您需要提供一个docker build --build-arg选项

docker build \
  --build-arg BASE_IMAGE=mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim-arm32v7 \
  .
Run Code Online (Sandbox Code Playgroud)

除此之外,Docker 没有任何条件或文件包含功能。