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



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

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

以下是其中一个Dockerfiles的样子:

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

可以动态指定在启动容器时要运行的命令。这被附加到ENTRYPOINT;但是,DockerfileENTRYPOINT不是必需的。如果在你的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