![](/img/trans.png)
[英]dotnet tests fails in container as a part of docker build, but works when run manually
[英]Unable to run dotnet test in docker container when run as non root
問題:以非 root 用戶身份在容器中運行dotnet test
失敗。
細節:
dotnet test
在以 root 用戶身份運行時使用以下 docker 文件和 docker 命令成功運行。
Docker 文件:
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /app
# run the tests
COPY [".", "."]
ENTRYPOINT ["dotnet","test"]
Docker 構建命令:
docker build -t test:v1 .
Docker 運行命令:
docker run test:v1
相反,如果我使用以下 docker 文件和以上 docker 構建和運行命令以非 root 用戶身份運行dotnet test
,則它會失敗。
Docker 文件:
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
RUN mkdir -p /app/DOTNET_CLI_HOME
ENV DOTNET_CLI_HOME="/app/DOTNET_CLI_HOME"
RUN adduser --disabled-password --system --uid 1000 --home /app --gecos "" dotnetuser && chown -R dotnetuser /app
USER dotnetuser
WORKDIR /app
# run the component tests
COPY [".", "."]
ENTRYPOINT ["dotnet","test"]
上述docker文件說明:
添加ENV DOTNET_CLI_HOME="/app/DOTNET_CLI_HOME"
以緩解System.UnauthorizedAccessException
錯誤。 詳情可以看這個鏈接: Dotnet build permission denied in Docker container running Jenkins
但盡管如此,我在使用上述 Docker 文件運行容器時遇到錯誤。 日志:
確定要恢復的項目... /usr/share/dotnet/sdk/5.0.102/NuGet.targets(131,5): 錯誤:訪問路徑'/app/obj/808903f8-54b1-4814-9c09-345ae588c134 .tmp' 被拒絕。 [/app/simpleapi-test.csproj] /usr/share/dotnet/sdk/5.0.102/NuGet.targets(131,5):錯誤:
權限被拒絕 [/app/simpleapi-test.csproj]
我想以非 root 用戶身份在容器中運行 dotnet test。 如果有人可以幫助我解決這個問題,那就太好了。
您可以直接在構建中創建非 root 用戶,而不是在 Dockerfile 中創建。 您只需在構建命令期間添加這樣的環境變量。 -e PUID=1000 -e PGID=1000
所以你的 Dockerfile 將是:
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
RUN mkdir -p /app/DOTNET_CLI_HOME
ENV DOTNET_CLI_HOME="/app/DOTNET_CLI_HOME"
USER dotnetuser
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet","test"]
此外,建議不要復制 docker 映像中的所有內容,您可以選擇性地復制所需文件或進行COPY. .
COPY. .
並在.dockerignore文件中添加不需要的文件。
因此,最后,您的 docker 構建將是:
docker build -e PUID=1000 -e PGID=1000 -t test:v1 .
抱歉,我沒有使用過 dotnet,因此無法為您提供生產級圖像,但如果您正在尋找創建非根 docker 圖像,這就是它的完成方式。 希望這可以幫助。
Docker 文件中的指令順序錯誤。 在我使用下面的 docker 文件更正它之后,一切都按預期工作。
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
RUN mkdir -p /app/DOTNET_CLI_HOME
COPY [".", "/app"]
ENV DOTNET_CLI_HOME="/app/DOTNET_CLI_HOME"
RUN adduser --disabled-password --system --uid 1000 --home /app --gecos "" dotnetuser && chown -R dotnetuser /app
USER dotnetuser
WORKDIR /app
ENTRYPOINT ["dotnet","test"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.