簡體   English   中英

以非 root 身份運行時無法在 docker 容器中運行 dotnet 測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM