【问题标题】:Bazel build docker container with local golang moduleBazel 使用本地 golang 模块构建 docker 容器
【发布时间】:2021-12-27 03:30:57
【问题描述】:

首先让我说我是 Bazel 的新手。我正在尝试从包含本地模块引用的 golang 项目构建 Docker 容器。

首先我要创建一个本地 golang 模块:

go mod init go-example

这是一般项目结构:

.
├── BUILD.bazel
├── WORKSPACE
├── cmd
│   └── hello
│       ├── BUILD.bazel
│       └── main.go
├── go.mod
├── go.sum
└── pkg
    └── echo
        ├── BUILD.bazel
        └── echo.go

main.go 我正在从本地模块导入pkg/echo

import (
    "go-example/pkg/echo"
)
(top level BUILD.bazel)

...

# gazelle:prefix go-example

✅ 默认 bazel 构建工作

$ bazel run //:gazelle
$ bazel build //cmd/hello 

❌ Docker 构建失败。我收到以下错误:

(cmd/hello/BUILD.bazel)

...

go_image(
    name = "docker",
    srcs = ["main.go"],
    importpath = "go-example/cmd/hello",
)
$ bazel build //cmd/hello:docker
...
compilepkg: missing strict dependencies:
    /private/var/tmp/_bazel[...]/__main__/cmd/hello/main.go: import of "go-example/pkg/echo"
No dependencies were provided.

【问题讨论】:

    标签: docker go bazel go-modules bazel-rules


    【解决方案1】:

    想通了,如果其他人偶然发现,请在此处发布。

    答案很简单——您需要在go_image 规则中嵌入go_library 规则。这是我的cmd/hello/BUILD.bazel,我还将 go 图像嵌入到 docker 容器中

    load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
    load("@io_bazel_rules_docker//go:image.bzl", "go_image")
    load("@io_bazel_rules_docker//container:container.bzl", "container_image")
    
    go_library(
        name = "hello_lib",
        srcs = ["main.go"],
        importpath = "go-example/cmd/hello",
        visibility = ["//visibility:private"],
        deps = ["//pkg/echo"],
    )
    
    go_binary(
        name = "hello",
        embed = [":hello_lib"],
        visibility = ["//visibility:public"],
    )
    
    go_image(
        name = "hello_go_image",
        embed = [":hello_lib"],
        goarch = "amd64",
        goos = "linux",
        pure = "on",
    )
    
    container_image(
        name = "docker",
        base = ":hello_go_image",
    )
    
    

    现在可以运行bazel build //cmd/hello:docker

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      相关资源
      最近更新 更多