将Docker卷挂载到主机路径

5
我需要从容器中访问主机上的测试结果文件。我知道需要创建一个卷,将主机和容器映射起来,例如下面这样,但是我没有把任何内容写入主机。
docker run --rm -it -v <host_directory_path>:<container_path> imagename

Dockerfile:

FROM microsoft/dotnet:2.1-sdk AS builder
WORKDIR /app
COPY ./src/MyApplication.Program/MyApplication.Program.csproj ./src/MyApplication.Program/MyApplication.Program.csproj
COPY nuget.config ./
WORKDIR ./src/MyApplication.Program/
RUN dotnet restore
WORKDIR /app
COPY ./src ./src
WORKDIR ./src/MyApplication.Program/
RUN dotnet build MyApplication.Program.csproj -c Release

FROM builder as tester
WORKDIR /app
COPY ./test/MyApplication.UnitTests/MyApplication.UnitTests.csproj ./test/MyApplication.UnitTests/MyApplication.UnitTests.csproj
WORKDIR ./test/MyApplication.UnitTests/
RUN dotnet restore
WORKDIR /app
COPY ./test ./test
WORKDIR ./test/MyApplication.UnitTests/
RUN dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
ENTRYPOINT ["dotnet", "reportgenerator", "-reports:coverage.cobertura.xml", "-targetdir:codecoveragereports", "-reportTypes:htmlInline"]

入口点处的命令正在正确地运行。 它将输出写入MyApplication.UnitTests/codecoveragereports目录,但不会写入主机目录。

我的docker运行如下:

docker run --rm -it -v /codecoveragereports:/app/test/MyApplication.UnitTests/codecoveragereports routethink.tests:latest

我可能做错了什么?


你尝试在Dockerfile中将docker目录声明为卷了吗? VOLUME /app/test/MyApplication.UnitTests/codecoveragereports - johnpaton
在Dockerfile中声明VOLUME通常只会导致意外的副作用;它对docker run -v选项没有影响。 - David Maze
如果您将绑定挂载到容器中的非空目录中,则该目录的现有内容将被绑定挂载所覆盖。当您在运行时绑定挂载卷时,您的输出被写入,但会被遮蔽。这只是一种诊断方法,而不是解决方法。 - Proyag
@Siyu 我猜 / 代表我正在运行 docker run 的路径? - Dave New
@Siyu,那就是我的问题!谢谢你——请随意创建一个答案,以便我接受。 - Dave New
1个回答

1
看起来是一个权限问题。

-v /codecoveragereports:/app/***/codecoveragereports 挂载了根目录下的一个目录 /,这很危险并且你可能没有权限。

最好挂载到本地,像这样 -v $PWD/codecoveragereports:/app/***/codecoveragereports,其中 $PWD 是一个等于当前工作目录的环境变量。


1
谢谢 - 这个有效 - 我的问题在于我假设它默认为执行目录,而没有使用 $PWD。 - Dave New

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接