挂载卷 .NET Core Docker
Mount volumes .NET Core Docker
我有以下Dockerfile
创建.NET Core 2.1 APP:
FROM microsoft/dotnet:2.1.402-sdk AS builder
WORKDIR /app
# copy csproj and restore as distinct layers
COPY . .
RUN dotnet restore ./myproject.sln
# copy everything else and build
COPY . .
RUN dotnet publish ./myproject/myproject.csproj -c Release -o /app/out
# build runtime image
FROM microsoft/dotnet:2.1.4-aspnetcore-runtime
WORKDIR /app
COPY --from=builder /app/out ./
ENV ASPNETCORE_ENVIRONMENT Production
ENTRYPOINT ["dotnet", "myproject.dll"]
我创建了 Docker 图像,并且可以毫无问题地实例化容器。当我尝试在此容器与另一个容器之间共享数据时,我创建了以下 docker-compose
文件:
version: "2"
services:
another_app:
restart: always
image: another_app:latest
container_name: another_app
ports:
- "4000"
volumes:
- shared-folder:/dist
myproject_app:
restart: always
image: myproject:latest
container_name: myproject
volumes:
- shared-folder:/app
volumes:
shared-folder:
这样配置是行不通的。我收到该应用程序的奇怪 .NET 消息:
myproject_app | Did you mean to run dotnet SDK commands? Please install dotnet SDK from:
myproject_app | http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
another_app| 0|another-a | Node Express server listening on http://localhost:4000
现在我发现当我定义不在应用程序根目录中的卷时问题就消失了。例如,如果我这样做:
myproject_app:
restart: always
image: myproject:latest
container_name: myproject
volumes:
- shared-folder:/app/another-folder
然后就可以了。为什么不能在 .NET Core 应用程序的根级别安装卷,为什么会出现该错误?
我遇到过类似的问题,我想我知道原因了:
Configuring that way it does not work. I get a weird .NET message for that app:
myproject_app | Did you mean to run dotnet SDK commands? Please install dotnet SDK from:
myproject_app | http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
another_app| 0|another-a | Node Express server listening on http://localhost:4000
出现此消息是因为 dotnet 工具找不到 .dll
文件,因此将其视为 dotnet 子命令,然后抛出错误,因为它需要 dotnet sdk。 (因为上次构建只包含运行时)
主要问题
问题在于 docker 卷 shared-folder:/app
和 WORKDIR
的用法是 /app
。这里真正发生的是,当连接 docker 卷时,它 覆盖 容器 /app
目录的内容,并使用本地的 shared-folder
目录机,因此无法找到应用程序 .dll
文件,并发生上述错误。
这就是为什么当您将它更改为 shared-folder:/app/another-folder
时它能够完美地工作,因为它被映射到容器中的一个空目录。
我有以下Dockerfile
创建.NET Core 2.1 APP:
FROM microsoft/dotnet:2.1.402-sdk AS builder
WORKDIR /app
# copy csproj and restore as distinct layers
COPY . .
RUN dotnet restore ./myproject.sln
# copy everything else and build
COPY . .
RUN dotnet publish ./myproject/myproject.csproj -c Release -o /app/out
# build runtime image
FROM microsoft/dotnet:2.1.4-aspnetcore-runtime
WORKDIR /app
COPY --from=builder /app/out ./
ENV ASPNETCORE_ENVIRONMENT Production
ENTRYPOINT ["dotnet", "myproject.dll"]
我创建了 Docker 图像,并且可以毫无问题地实例化容器。当我尝试在此容器与另一个容器之间共享数据时,我创建了以下 docker-compose
文件:
version: "2"
services:
another_app:
restart: always
image: another_app:latest
container_name: another_app
ports:
- "4000"
volumes:
- shared-folder:/dist
myproject_app:
restart: always
image: myproject:latest
container_name: myproject
volumes:
- shared-folder:/app
volumes:
shared-folder:
这样配置是行不通的。我收到该应用程序的奇怪 .NET 消息:
myproject_app | Did you mean to run dotnet SDK commands? Please install dotnet SDK from:
myproject_app | http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
another_app| 0|another-a | Node Express server listening on http://localhost:4000
现在我发现当我定义不在应用程序根目录中的卷时问题就消失了。例如,如果我这样做:
myproject_app:
restart: always
image: myproject:latest
container_name: myproject
volumes:
- shared-folder:/app/another-folder
然后就可以了。为什么不能在 .NET Core 应用程序的根级别安装卷,为什么会出现该错误?
我遇到过类似的问题,我想我知道原因了:
Configuring that way it does not work. I get a weird .NET message for that app:
myproject_app | Did you mean to run dotnet SDK commands? Please install dotnet SDK from: myproject_app | http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409 another_app| 0|another-a | Node Express server listening on http://localhost:4000
出现此消息是因为 dotnet 工具找不到 .dll
文件,因此将其视为 dotnet 子命令,然后抛出错误,因为它需要 dotnet sdk。 (因为上次构建只包含运行时)
主要问题
问题在于 docker 卷 shared-folder:/app
和 WORKDIR
的用法是 /app
。这里真正发生的是,当连接 docker 卷时,它 覆盖 容器 /app
目录的内容,并使用本地的 shared-folder
目录机,因此无法找到应用程序 .dll
文件,并发生上述错误。
这就是为什么当您将它更改为 shared-folder:/app/another-folder
时它能够完美地工作,因为它被映射到容器中的一个空目录。