为 Go 程序构建最小容器
Building a minimal container for a Go program
我想使用 Buildah 从头开始构建一个小型容器镜像 运行 Go 应用程序。
除了应用程序本身,还需要包括哪些其他库等。我认为需要 glibc - 还有其他吗?
所以总而言之,我想我在问 "what are all the external dependencies that a compiled Go app needs on Linux?"
我假设您已经在 docker 图像中包含了应用依赖项。
构建 docker 图像不需要任何外部依赖。只需来自 Go 的基础映像就足以在 Linux 台机器上构建和 运行。
# Start from the latest Go base image
FROM golang:latest
# Set the Current Working Directory inside the container
WORKDIR /app
# Copy go mod and sum files
COPY go.mod go.sum ./
# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed
RUN go mod download
@Dave C 给出了正确回答这个问题的信息。将 ldd 与测试应用一起使用返回:
[bryon@localhost resttest]$ ldd restest
linux-vdso.so.1 (0x00007fff139fe000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbad6ce2000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbad691f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbad6f02000)
[bryon@localhost resttest]$
因此,对于那些希望使用 Buildah 构建最小容器的人来说,生成它的 BASH 脚本如下所示:
#!/bin/bash
#
# Run this shell script after you have run the command: "buildah unshare"
#
git clone https://github.com/bryonbaker/resttest.git
cd resttest
go build restest.go
container=$(buildah from scratch)
mnt=$(buildah mount $container)
mkdir $mnt/bin
mkdir $mnt/lib64
buildah config --workingdir /bin $container
buildah copy $container restest /bin/restest
buildah copy $container /lib64/libpthread.so.0 /lib64
buildah copy $container /lib64/libc.so.6 /lib64
buildah copy $container /lib64/ld-linux-x86-64.so.2 /lib64
buildah config --port 8000 $container
#
# This step is not working properly.
# Need to run with podman -p 8000:8000 --entrypoint /bin/restest restest:latest
buildah config --entrypoint /bin/restest $container
buildah commit --format docker $container restest:latest
这会为一个简单的微服务生成一个 14MB 的容器!没有额外的文件需要担心漏洞等问题。
我有一个小缺陷,我无法解决入口点问题,所以我在开始时覆盖了入口点,但为了测试它 运行:
podman -p8000:8000 --entrypoint /bin/restest restest:latest
然后只需在终端会话中键入以下内容:
curl http://localhost:8000
非常感谢 Dave C!
我想使用 Buildah 从头开始构建一个小型容器镜像 运行 Go 应用程序。 除了应用程序本身,还需要包括哪些其他库等。我认为需要 glibc - 还有其他吗?
所以总而言之,我想我在问 "what are all the external dependencies that a compiled Go app needs on Linux?"
我假设您已经在 docker 图像中包含了应用依赖项。
构建 docker 图像不需要任何外部依赖。只需来自 Go 的基础映像就足以在 Linux 台机器上构建和 运行。
# Start from the latest Go base image
FROM golang:latest
# Set the Current Working Directory inside the container
WORKDIR /app
# Copy go mod and sum files
COPY go.mod go.sum ./
# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed
RUN go mod download
@Dave C 给出了正确回答这个问题的信息。将 ldd 与测试应用一起使用返回:
[bryon@localhost resttest]$ ldd restest
linux-vdso.so.1 (0x00007fff139fe000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbad6ce2000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbad691f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbad6f02000)
[bryon@localhost resttest]$
因此,对于那些希望使用 Buildah 构建最小容器的人来说,生成它的 BASH 脚本如下所示:
#!/bin/bash
#
# Run this shell script after you have run the command: "buildah unshare"
#
git clone https://github.com/bryonbaker/resttest.git
cd resttest
go build restest.go
container=$(buildah from scratch)
mnt=$(buildah mount $container)
mkdir $mnt/bin
mkdir $mnt/lib64
buildah config --workingdir /bin $container
buildah copy $container restest /bin/restest
buildah copy $container /lib64/libpthread.so.0 /lib64
buildah copy $container /lib64/libc.so.6 /lib64
buildah copy $container /lib64/ld-linux-x86-64.so.2 /lib64
buildah config --port 8000 $container
#
# This step is not working properly.
# Need to run with podman -p 8000:8000 --entrypoint /bin/restest restest:latest
buildah config --entrypoint /bin/restest $container
buildah commit --format docker $container restest:latest
这会为一个简单的微服务生成一个 14MB 的容器!没有额外的文件需要担心漏洞等问题。
我有一个小缺陷,我无法解决入口点问题,所以我在开始时覆盖了入口点,但为了测试它 运行:
podman -p8000:8000 --entrypoint /bin/restest restest:latest
然后只需在终端会话中键入以下内容:
curl http://localhost:8000
非常感谢 Dave C!