docker - 如何在 Go Docker 多阶段构建中添加本地依赖?

标签 docker go dockerfile

如何从同一 Go 项目中的文件夹添加本地依赖项?

我有以下目录结构:

.
├── backend
│   ├── Dockerfile
│   ├── conduit
│   │   └── get_data.go
│   ├── main.go
│   ├── main_test.go
│   ├── storage
│   │   ├── create_client.go
│   │   └── read_data.go
├── cron_job
│   ├── Dockerfile
│   ├── main.go
│   └── main_test.go

和 Dockerfile:

FROM golang:1.10.1 as builder
ADD . github.com/dalderman77/phacts/backend/conduit
ADD . github.com/dalderman77/phacts/backend/storage
WORKDIR /go/src/github.com/dalderman77/phacts/cron_job
# Get dependencies
RUN go get -d -v cloud.google.com/go/datastore golang.org/x/net/context
COPY . .
# Compile Go binary
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

# Create smaller lightweight container
FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
# Copy binary from previous stage
COPY --from=builder /go/src/github.com/dalderman77/phacts/cron_job/main .
CMD ["./main"]  

到目前为止,我所拥有的是基于 Use multi-stage builds

问题是编译后的二进制文件依赖于后端目录中的代码。它在本地编译得很好,但我不确定如何正确添加这些依赖项,以便它们可以在容器中编译:

main.go:9:2: cannot find package "github.com/dalderman77/phacts/backend/conduit" in any of:
        /usr/local/go/src/github.com/dalderman77/phacts/backend/conduit (from $GOROOT)
        /go/src/github.com/dalderman77/phacts/backend/conduit (from $GOPATH)
main.go:10:2: cannot find package "github.com/dalderman77/phacts/backend/storage" in any of:
        /usr/local/go/src/github.com/dalderman77/phacts/backend/storage 

最佳答案

在 Dockerfile 中,此命令用于编译您的代码:

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

这将使您的二进制文件 static ,允许您执行构建的第二步,因为您现在可以从小图像开始(在您的情况下是 Alpine ,但您甚至可以尝试使用 empty image )而不依赖容器内的任何依赖项。

在您的示例中,您要将 ca 证书添加到最终图像:

运行 apk --no-cache 添加 ca-certificates

如果您在应用程序中发出 HTTPS 请求,您可能需要这个,因为 alpine 容器在其文件系统中没有任何证书。通常,您的应用程序所需的任何静态资源(例如图像、html/电子邮件模板、脚本等)都必须通过 COPY 或 ADD 命令添加到生成的图像中。

另请查看this outstanding guide关于如何构建最小的 Docker 容器。

编辑:您的构建问题发生是因为 cron_job 无法从 backend 找到包,因为您没有复制 backend 到正确的 $GOPATH 文件夹中的容器。要解决此问题,您需要使用依赖项管理器工具来供应您的依赖项。目前官方的是dep .

恢复 cron_job 的依赖项(在您的本地机器上,不是 在您的容器内)将创建 vendor 子文件夹,其中您的每个所需的依赖项项目将被存储。现在,当您将 cron_job 复制到容器时,构建还会查看 vendor 文件夹以检查是否缺少依赖项。

关于docker - 如何在 Go Docker 多阶段构建中添加本地依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50369198/

相关文章:

mysql - Docker mysql - 在镜像启动时运行更新命令/脚本

php-fpm 连接被对等方重置

mysql - centos前台运行mysql

go - 如何在golang中使用空格距离进行输入

mongodb - mgo 中的 $dateToString 不起作用

mongodb - map[string]interface{} 自切换到新的 go mongo 驱动程序后未被正确解析

docker - gitlab 中基本 ci 实现错误致命 : couldn't find remote ref

docker - Docker Compose文件:从另一个文件引用环境变量

node.js - Dockerfile 问题 : cannot copy folder from source(host) to destination(container) folder

docker - 从本地Dockerfile生成的Docker构建会挂起(Windows 10)