gpt4 book ai didi

docker - Bazel 使用本地 golang 模块构建 docker 容器

转载 作者:行者123 更新时间:2023-12-05 05:53:05 27 4
gpt4 key购买 nike

首先让我说我是 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.

最佳答案

弄明白了,如果其他人偶然发现了这个问题,请在此处发布。

答案很简单 - 您需要将 go_library 规则嵌入到 go_image 规则中。这是我的 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

关于docker - Bazel 使用本地 golang 模块构建 docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69982637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com