我有一个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? >
答案 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]