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

poc*_*ckn 16 go docker

我有一个拥有各种 Go 服务和库的 monorepo。它有一个结构

monorepo
 services 
  service-a 
   - Dockerfile
go.mod
go.sum
Run Code Online (Sandbox Code Playgroud)

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

我用

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"]
Run Code Online (Sandbox Code Playgroud)

我需要做些什么才能将不在当前目录中的文件添加到我的 Docker 映像中,而不必在 monorepo 中的每个服务中使用单独的 go.mod 和 go.sum?

Bur*_*dar 23

Docker 只允许从上下文向图像添加文件,默认情况下,上下文是包含 Dockerfile 的目录。您可以在构建时指定不同的上下文,但同样,它不会让您包含该上下文之外的文件:

docker build -f ./services/service-a/Dockerfile .
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以创建一个临时目录,将所有工件复制到那里并将其用作构建上下文。这可以通过 makefile 或构建脚本自动化。


小智 8

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

\n
project_folder  \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 src  \n\xe2\x94\x82    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 folder1\n\xe2\x94\x82        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 folder2\n\xe2\x94\x82            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Dockerfile\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker-compose.yaml   \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 copied_file.ext \n
Run Code Online (Sandbox Code Playgroud)\n

docker-compose.yaml

\n
version: '3'\nservices:\n\n    your_service_name:\n        build:\n            context: ./ #project_folder for this case\n            dockerfile: ./src/folder1/folder2/Dockefile\n
Run Code Online (Sandbox Code Playgroud)\n

Dockerfile

\n
FROM xxx\nCOPY copied_file.ext /target_folder/\n
Run Code Online (Sandbox Code Playgroud)\n

构建或重建服务:

\n
docker-compose build\n
Run Code Online (Sandbox Code Playgroud)\n

在服务上运行一次性命令:

\n
docker-compose run your_service_name <command> [arguments]\n
Run Code Online (Sandbox Code Playgroud)\n