为Go程序构建一个最小的容器

我想使用Buildah从头开始构建一个小的容器映像,以运行Go应用程序。
除了应用程序本身 ,需要包含哪些其他库等。 我认为glibc是必需的-还有其他吗?</ p>

总而言之,我想问的是“ Linux上经过编译的Go应用需要什么外部依赖?” </ p>
</ div>

展开原文

原文

I want to build a tiny container image from scratch using Buildah to run a Go app. Apart from the app itself, what other libraries etc need to be included. I am thinking that glibc is needed - is there anything else?

So in summary, I think I am asking "what are all the external dependencies that a compiled Go app needs on Linux?"

duan19740319
duan19740319 ldd命令应该告诉您动态链接的可执行文件需要哪些共享库。如前所述,可能还会有文件被引用/需要(例如,在/etc中)。
大约一年之前 回复
duandu5846
duandu5846 您可能需要Go标准软件包使用的这些外部文件:根证书,时区信息。
大约一年之前 回复
dongza6247
dongza6247 编译后的二进制Go应用程序是独立的,因此没有依赖性。如果使用syscall加载外部库,或者打开并读取外部文件,则显然将需要这些文件,但除此之外,将不需要任何东西。
大约一年之前 回复

2个回答

@Dave C gave the information to correctly answer this. Using ldd with the test app returned:

[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]$ 

So for those looking to build a minimal container with Buildah, the BASH script to generate it would look like this:

#!/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

This generates a 14MB container for a simple microservice! There are no additional files to be worrying about for vulnerabilities etc.

I have a small defect I can't work out on entrypoints so I am overriding the entrypoint on start, but to test it run:

podman -p8000:8000 --entrypoint /bin/restest restest:latest

Then just type the following in a Terminal session:

curl http://localhost:8000

So thanks Dave C!



我假设您已将应用程序依赖项包含在docker映像中。</ p>

您不会 需要任何外部依赖关系来构建docker映像。 只需Go的基础映像就足以在Linux机器上构建和运行。</ p>

 #从最新的Go基础映像开始
FROM golang:latest

#设置当前 容器内的工作目录
WORKDIR / app

#复制go mod和求和文件
COPY go.mod go.sum ./

#下载所有依赖项。 如果go.mod和go.sum文件未更改,则依赖项将被缓存
RUN go mod下载
</ code> </ pre>
</ div>

展开原文

原文

I am assuming you have included the app dependencies in your docker image.

You won't require any external dependency to build a docker image. Just base image from Go is sufficient to build and run on Linux machines.

# 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

dongshanyan0322
dongshanyan0322 这是一个很好的答案,只是不回答所提出的问题。
大约一年之前 回复
doujiu8918
doujiu8918 那是对的。 二进制文件是在外部构建的。 一个简单的微服务,在TCP端口上侦听和发送。 我只想将其容器化。 Buildah具有强大的功能来生成最少的图像-但是要做到这一点,您需要了解需要包括哪些类型的依赖项。 (因此提出问题)。
大约一年之前 回复
dso89762
dso89762 这是构建应用程序的图像,对吗? 我认为,只运行它,除了生成的二进制文件外,不需要任何东西。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐