我正在使用 VS2017 构建一个支持 docker-compose 的简单 DotnetCore 应用程序。
我有两个 Dockerfile,一个用于应用程序,一个用于 NGINX 代理。除此之外,还有一个将这两个文件包装在一起的 docker-compose.yml 文件。
这是 aspnetcore 应用程序 Dockerfile,其中有许多 COPY 语句,它们都正常工作!
FROM microsoft/dotnet:2.0-runtime AS base
WORKDIR /app
FROM microsoft/dotnet:2.0-sdk AS build
WORKDIR /src
COPY CoreServer.sln ./
COPY CoreServer/CoreServer.csproj CoreServer/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/CoreServer
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "CoreServer.dll"]
这是 nginx Dockerfile,它无法正确复制文件。相反,它输出以下错误:
COPY 失败:stat /var/lib/docker/tmp/docker-builder780242597/nginx.conf:没有该文件或目录。#1859
FROM nginx
WORKDIR /etc/nginx
COPY nginx.conf ./
COPY server.crt ./
COPY server.key ./
我尝试自行构建这个 Dockerfile,并且它可以工作,但是当我使用 docker-compose 时,它会出现上述错误。
docker-compose.yml 文件如下所示
version: '3'
services:
coreserver:
image: coreserver
build:
context: .
dockerfile: CoreServer/Dockerfile
expose:
- "5000"
nginx:
build:
context: .
dockerfile: nginx/Dockerfile
ports:
- "80:80"
- "443:443"
links:
- coreserver
如果您想查看完整的项目,它是一个带有服务器和客户端应用程序的 dotnetcore websocket 服务器测试应用程序。
https://github.com/avboivin/WssCoreServer/tree/master/server
有人能告诉我我做错了什么,导致 docker send 出现这个错误吗?
答案1
从https://docs.docker.com/engine/reference/builder/#copy. 说:
COPY 遵循以下规则:
[src] 路径必须位于构建上下文内;您不能 COPY ../something /something,因为 docker build 的第一步是将上下文目录(和子目录)发送到 docker 守护程序。
如果 [src] 是一个目录,则会复制该目录的全部内容,包括文件系统元数据。
所以这不是错误。COPY 无法从您的绝对路径读取文件。
因此解决方案是在与 SOURCE dir/files 相同的目录中创建 docker-compose.yml 并运行它。
答案2
看起来这是一个错误。
我在这里找到了解决方案:
https://github.com/docker/for-mac/issues/1922#issuecomment-355364451
这只是移动在 docker-compose.yaml 文件根级别存在问题的 Dockerfile。
答案3
正如@guhkun13提到的,你需要处于正确的上下文中才能使COPY工作。在docker-compose.yml中,你可以在
services:
<your_service_name>:
build:
context:
请注意,您已为两个服务指定了上下文“。”。因此 COPY 将根目录作为上下文。将 docker-compose.yml 更改为以下内容,问题将得到解决。
version: '3'
services:
coreserver:
image: coreserver
build:
context: CoreServer
expose:
- "5000"
nginx:
build:
context: nginx
ports:
- "80:80"
- "443:443"
links:
- coreserver