如何在 Docker 图像中动态设置入口点 dll

How to set the entrypoint dll dynamically in Docker image

我们想为几个不同的项目使用一个 Dockerfile

项目结构相同,唯一不同的是 Dockerfile 关注的是入口点 dll

下面是其中一个 Dockerfile 的样子:

FROM mcr.microsoft.com/dotnet/runtime:5.0-alpine3.13-amd64

WORKDIR /app
COPY . .

ENTRYPOINT ["dotnet", "dllName.dll"]

我想过类似的事情:

FROM mcr.microsoft.com/dotnet/runtime:5.0-alpine3.13-amd64

ARG DLL_NAME

RUN echo "Building for $DLL_NAME"

WORKDIR /app
COPY . .

ENTRYPOINT ["dotnet", $DLL_NAME]

并构建它:--build-arg "DLL_NAME=dllName.dll"
但是,当 运行 图像时,ENTRYPOINT ["dotnet", $DLL_NAME] 命令似乎无法执行:

/bin/sh: [dotnet,: not found

RUN 指令需要来自环境的变量。

请尝试更改

FROM mcr.microsoft.com/dotnet/runtime:5.0-alpine3.13-amd64

ARG DLL_NAME

RUN echo "Building for $DLL_NAME"

WORKDIR /app
COPY . .

ENTRYPOINT ["dotnet", $DLL_NAME]

进入

FROM mcr.microsoft.com/dotnet/runtime:5.0-alpine3.13-amd64

ARG DLL_NAME
ENV DLL_NAME=$DLL_NAME

RUN echo "Building for $DLL_NAME"

WORKDIR /app
COPY . .

ENTRYPOINT /bin/sh dotnet $DLL_NAME

您可以在启动容器时动态指定 运行 命令。这得到 appended to the ENTRYPOINT;但是,不需要 Dockerfile ENTRYPOINT。如果在您的 Dockerfile 中将 ENTRYPOINT 更改为 CMD

FROM mcr.microsoft.com/dotnet/runtime:5.0-alpine3.13-amd64
WORKDIR /app
COPY . .
CMD ["dotnet", "dllName.dll"] # <-- not ENTRYPOINT

然后当您启动容器时,您可以轻松覆盖它,而无需重建任何东西

docker run ... my-image \
  dotnet otherDll.dll