为什么Docker-compose无法将本地文件复制到容器

为什么Docker-compose无法将本地文件复制到容器

我正在使用 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

相关内容