我们想在几个不同的项目中使用一个Dockerfile
。
项目结构是相同的,唯一不同的是Dockerfile关注的入口点dll
。
以下是其中一个Dockerfile
s的样子:
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