带有 Go 插件的 Dockerfile

标签 docker go plugins dockerfile

我有一个 Dockerfile 可以为我们的项目创建一个图像。正确设置所有内容,但我正在寻找构建容器镜像的最佳方法,因为我们有更多插件可以决定项目的行为。

这样的话,有主二进制文件和大约 10 个插件,我可以为我的 Go 二进制文件使用 1 个或更多。目前这些插件大多与主项目在同一个存储库中,但将来会有其他插件在不同的存储库中。

我正在寻找拥有这些插件的 Docker 镜像构建机制的最佳方式。

我现在拥有的:

FROM golang:alpine AS builder

RUN apk update && apk add --no-cache build-base

# Create appuser.
RUN adduser -D -g '' project-user

WORKDIR $GOPATH/src/bitbucket.org/company/project
COPY . .

RUN GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /go/bin/project

# Minimal version of image
FROM scratch

COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /go/bin/project /go/bin/project

USER project-user
EXPOSE 7676

ENTRYPOINT ["/go/bin/project"]

这没有插件,所以它不会正常启动,因为二进制文件至少需要一个插件,但是有 plugins 标志等待像 plugin.so 这样的插件plugin1.so;plugin2.so;..

正如我所说,有多个插件,现在我们有 RPM 构建器,它们分别构建二进制文件和所有插件,我们执行 yum install project plugin1 plugin2 并在配置文件中 (因为标志也可以从配置中读取)我们添加了插件。

我们想更改为 Kubernetes,所以这就是我在 Dockerfile 中寻找此解决方案的原因。

最佳答案

首先,我发现您的 Dockerfile 存在一些问题,我只能解决这些问题,因为我不完全理解您的“插件”问题。

  1. 像那样复制 /etc/passwd 是个坏主意,您可以使用这种方法,但您必须为用户和组复制所有相关文件, cp/etc/{passwd,shadow,group,gshadow} 例如,然后一定要修复权限。仅在最终图像中创建用户会更安全,您甚至不会在构建器中使用它,并且如果这是您通过运行 adduser 的目标,则上下文大小可以忽略不计在构建器中。

  2. 如果您的 go 程序调用 C 代码,那么您需要将最终图像基于 scratch 之外的东西,因为它没有所需的库。您需要一个带有 libc 变体的基础图像,最轻量级的是 musl,您可以通过 alpine 图像获得它。如果您的 go 程序不调用任何 C 代码,那么您可以在 go build 期间使用 CGO_ENABLED=0 标志然后你构建的二进制程序将不依赖于任何东西,因此你可以使用 scratchbusybox 基本图像。您可以在 cgo here 上找到更多信息.

关于带有 Go 插件的 Dockerfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55038431/

相关文章:

go - 如何在 mapstructure.decode 中传递结构字段的指针

go - 如何在 2 个 channel 上等待并在它们都准备好读取时继续

plugins - Griffon 如何运行本地插件

docker - 建立我们自己的私有(private) docker 中心

Golang Alloc 和 HeapAlloc vs pprof 大的差异

Travis CI 中的 Docker 构建失败 - 模式中出现 "Error checking context: ' 语法错误”

perl - 如何将 Perl Moose 与插件一起用于主要对象?

javascript - 使用 Webpack 模拟 <script> 标签

centos - Vagrant 如何在 CentOS 上自动安装 Docker?

laravel - Docker Laravel Vuejs Nginx,加载资源时出现问题