最好 practice/way 将 Golang 应用开发为 运行 在 Docker 容器中
Best practice/way to develop Golang app to be run in Docker container
基本上如标题所述...是否有最佳实践或有效方法来开发将 Docker 化的 Golang 应用程序?我知道您可以挂载卷以指向您的源代码,它非常适合像 PHP 这样不需要编译代码的语言。但是对于 Go 来说,与 Docker 一起开发似乎很痛苦,因为我猜你几乎只有两个选择。
首先是要有一个 Docker 文件,它只是在构建时,所以它会在容器 运行 时启动 go 应用程序,因此必须在每次更改时构建一个新图像(无论是小或不)。或者,您将源代码目录挂载到容器目录,然后附加到容器本身并像往常一样自己手动执行 build/run。
这两种方式实际上是我看到它发生的唯一方式,除非你不在 docker 容器中开发你的 Go 应用程序。只需像往常一样开发它,然后使用 scratch image 方法将 Go 预先构建成二进制文件,然后在准备好 运行 时将其复制到容器中。我认为这可能是可行的方法,但我想就此问题询问更多专业人士,并可能获得有关该主题的一些反馈。
不确定这是最好的做法,但这是我的方法。
- Makefile 是强制性的
- 使用我的本地机器和我的 go 工具进行小的迭代
- 使用基于golang:{1.X,latest}的专用构建容器,挂载代码目录构建release,主要是保证我的代码在CI上正确构建。 (提示,这是我用于发布构建的标准 go build 命令:
CGO_ENABLED=0 GOGC=off go build -ldflags -s -w
)
- 测试代码
- 然后使用
FROM scratch
构建发布容器(复制bin+entrypoint)
- 将您的图像推送到您的注册表
第 3 步到第 6 步是 CI 的任务。
重要说明:由于新的多阶段构建功能,这正在发生变化:https://docs.docker.com/engine/userguide/eng-image/multistage-build/,不再构建与发布容器。
构建容器和发布容器将合并到一个多阶段构建中,因此一个 Dockerfile 具有(不确定语法是否正确,但您会明白):
FROM golang:latest as build
WORKDIR /go/src/myrepos/myproject
RUN go build -o mybin
FROM scratch
COPY --from=build /go/src/myrepos/myproject/mybin /usr/local/bin/mybin
ENTRYPOINT [ "/usr/local/bin/mybin" ]
据我从你的问题中了解到,你想要一个 运行 容器来开发 golang 应用程序。同样的事情也可以在你的主机上完成。但好消息是,如果您可以构建这样的应用程序,那么它将被视为云平台即服务 (PaaS)。
容器的基本要求会是:Ubuntuimage和其他包如editor,golang compiler等等。
我建议查看 docker 开发环境。
https://docs.docker.com/opensource/project/set-up-dev-env/
docker 开发环境是 运行 在一个容器内,文件是从主机目录之一装载的。容器镜像是从 Ubuntu scratch 镜像构建的,并添加了编译 docker 源代码所需的包。
我希望你快找到你要找的东西了。
最近,我一直在使用
https://github.com/thockin/go-build-template
作为我所有项目的基础。该模板附带一个 Makefile,它将 build/test 您的应用程序 Docker。
基本上如标题所述...是否有最佳实践或有效方法来开发将 Docker 化的 Golang 应用程序?我知道您可以挂载卷以指向您的源代码,它非常适合像 PHP 这样不需要编译代码的语言。但是对于 Go 来说,与 Docker 一起开发似乎很痛苦,因为我猜你几乎只有两个选择。
首先是要有一个 Docker 文件,它只是在构建时,所以它会在容器 运行 时启动 go 应用程序,因此必须在每次更改时构建一个新图像(无论是小或不)。或者,您将源代码目录挂载到容器目录,然后附加到容器本身并像往常一样自己手动执行 build/run。
这两种方式实际上是我看到它发生的唯一方式,除非你不在 docker 容器中开发你的 Go 应用程序。只需像往常一样开发它,然后使用 scratch image 方法将 Go 预先构建成二进制文件,然后在准备好 运行 时将其复制到容器中。我认为这可能是可行的方法,但我想就此问题询问更多专业人士,并可能获得有关该主题的一些反馈。
不确定这是最好的做法,但这是我的方法。
- Makefile 是强制性的
- 使用我的本地机器和我的 go 工具进行小的迭代
- 使用基于golang:{1.X,latest}的专用构建容器,挂载代码目录构建release,主要是保证我的代码在CI上正确构建。 (提示,这是我用于发布构建的标准 go build 命令:
CGO_ENABLED=0 GOGC=off go build -ldflags -s -w
) - 测试代码
- 然后使用
FROM scratch
构建发布容器(复制bin+entrypoint) - 将您的图像推送到您的注册表
第 3 步到第 6 步是 CI 的任务。
重要说明:由于新的多阶段构建功能,这正在发生变化:https://docs.docker.com/engine/userguide/eng-image/multistage-build/,不再构建与发布容器。
构建容器和发布容器将合并到一个多阶段构建中,因此一个 Dockerfile 具有(不确定语法是否正确,但您会明白):
FROM golang:latest as build
WORKDIR /go/src/myrepos/myproject
RUN go build -o mybin
FROM scratch
COPY --from=build /go/src/myrepos/myproject/mybin /usr/local/bin/mybin
ENTRYPOINT [ "/usr/local/bin/mybin" ]
据我从你的问题中了解到,你想要一个 运行 容器来开发 golang 应用程序。同样的事情也可以在你的主机上完成。但好消息是,如果您可以构建这样的应用程序,那么它将被视为云平台即服务 (PaaS)。
容器的基本要求会是:Ubuntuimage和其他包如editor,golang compiler等等。
我建议查看 docker 开发环境。 https://docs.docker.com/opensource/project/set-up-dev-env/
docker 开发环境是 运行 在一个容器内,文件是从主机目录之一装载的。容器镜像是从 Ubuntu scratch 镜像构建的,并添加了编译 docker 源代码所需的包。
我希望你快找到你要找的东西了。
最近,我一直在使用 https://github.com/thockin/go-build-template 作为我所有项目的基础。该模板附带一个 Makefile,它将 build/test 您的应用程序 Docker。