COPY失败:构建上下文之外的禁止路径

时间:2020-04-13 20:41:38

标签: docker go

我有一个monorepo,其中包含各种Go服务和库。它的结构是

monorepo
 services 
  service-a 
   - Dockerfile
go.mod
go.sum

我的go.mod驻留在monorepo的根目录中,服务使用go.mod文件中声明的依赖项。

我使用以下命令构建Docker映像

docker build -t some:tag ./services/service-a /

当我尝试使用上述docker命令从monorepo的根目录构建Docker映像时,出现以下错误。

复制失败:构建上下文之外的禁止路径:../../ go.mod()

下面是我的Dockerfile

FROM golang:1.14.1-alpine3.11

RUN apk add --no-cache ca-certificates git

# Enable Go Modules
ENV GO111MODULE=on

# Set the Current Working Directory inside the container
WORKDIR /app

# Copy go mod and sum files
COPY ../../go.mod go.sum ./

RUN go mod download

COPY . .

RUN CGO_ENABLED=0 go build -o service-a

ENTRYPOINT ["/app/service-a"]

是否需要做一些事情才能将文件添加到不在当前目录中的Docker映像中,而不必在monorepo的每个服务中都具有单独的go.mod和go.sum? >

2 个答案:

答案 0 :(得分:5)

Docker仅允许从上下文将文件添加到映像,默认情况下是包含Dockerfile的目录。您可以在构建时指定其他上下文,但是同样,它也不允许您包含该上下文之外的文件:

docker build -f ./services/service-a/Dockerfile .

这应该使用当前目录作为上下文。

或者,您可以创建一个临时目录,在该目录中复制所有工件,并将其用作构建上下文。这可以通过生成文件或构建脚本来自动化。

答案 1 :(得分:0)

您可以使用 docker-compose 构建和管理您的 docker 容器,然后可以使用 help context 指令解决此问题,例如:

project_folder  
├─── src  
│    └── folder1
│        └── folder2
│            └── Dockerfile
├── docker-compose.yaml   
└── copied_file.ext 

docker-compose.yaml

version: '3'
services:

    your_service_name:
        build:
            context: ./ #project_folder for this case
            dockerfile: ./src/folder1/folder2/Dockefile

Dockerfile

FROM xxx
COPY copied_file.ext /target_folder/

构建或重建服务:

docker-compose build

对服务运行一次性命令:

docker-compose run your_service_name <command> [arguments]
相关问题