如何构建不链接到 musl libc 的 go 可执行文件

所以:

官方 Go 构建容器基于 Alpine。

Alpine 使用musl作为 libc 而不是 glibc。

我需要在可以在使用 glibc 的 Ubuntu 上运行的容器中构建一个 Go 可执行文件。

我怎么办

  1. 使官方 GoLang 构建容器使用 glibc 或

  2. 在基于 Ubuntu 的容器上构建我的 GoLang 项目

我不能使用Disable CGO解决方案,因为我的 Go 代码是 FUSE 驱动程序,它需要 CGO


蓝山帝景
浏览 118回答 2
2回答

米脂

该golang:latest图像基于 debian bullseye。除了使用此映像构建二进制文件外,您不需要任何其他东西,以便它可以在 ubuntu 上按原样运行。只需使用这一行而不是您当前使用的来启动您的 dockerfile。FROM golang:latest

繁星coding

从 Ubuntu 基础映像开始,并在其中设置 golang。发现它们时添加依赖项。如果你不太关心go的版本,那么Ubuntu的官方包就可以了,你不必下载官方的go release。这对我们有用(linux / mac 用户):文件FROM ubuntu:20.04 as baseARG BUILDPLATFORMARG TARGETPLATFORMRUN echo "Building for $TARGETPLATFORM on $BUILDPLATFORM"# Enable super fast apt caches for use with buildkit --mount=type=cacheRUN rm -f /etc/apt/apt.conf.d/docker-clean; \    echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache# Install dependencies for building# --mount docs: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/syntax.mdRUN --mount=type=cache,sharing=locked,target=/var/cache/apt \    --mount=type=cache,sharing=locked,target=/var/lib/apt \    apt-get update && \    DEBIAN_FRONTEND=noninteractive apt-get install -y \    awscli \    curl \    gcc \    git \    liblxc-dev \    liblxc1 \    lxc-utils \    make \    parallel \    pkg-config \    upx-ucl \    && apt-get clean && rm -rf /var/lib/apt/lists/*ARG GOVERSION=1.15ARG TARGETARCHADD https://dl.google.com/go/go${GOVERSION}.linux-${TARGETARCH}.tar.gz /tmp/golang.tar.gzRUN cd /opt && tar zxf /tmp/golang.tar.gz && rm /tmp/golang.tar.gz# Set timezone to UTCRUN echo 'UTC' > /etc/timezone && \    dpkg-reconfigure -f noninteractive tzdata# Set up go environment variablesENV GOPATH=/opt/gopathENV GOCACHE=/opt/gocacheENV GOROOT=/opt/goENV PATH="$GOROOT/bin/:$PATH"# Install go-bindata, it is used when building drone# go get installs to: $GOPATH/src and $GOPATH/bin# We then move the binary to $GOROOT so we can change GOPATH in our buildsRUN go get -u github.com/go-bindata/go-bindata/... && \    mv $GOPATH/bin/go-bindata $GOROOT/bin/go-bindata# Install https://staticcheck.io for statistical analysis of go codeRUN go get honnef.co/go/tools/cmd/staticcheck && \    mv $GOPATH/bin/staticcheck $GOROOT/bin/staticcheck# Install https://github.com/kyoh86/richgo for pretty color outputRUN go get -u github.com/kyoh86/richgo && \    mv $GOPATH/bin/richgo $GOROOT/bin/richgo# Set up working dir for this projectWORKDIR /workspace########## TESTS ########### Install dependencies for running testsRUN --mount=type=cache,sharing=locked,target=/var/cache/apt \    --mount=type=cache,sharing=locked,target=/var/lib/apt \    apt-get update && \    DEBIAN_FRONTEND=noninteractive apt-get install -y \    pigz \    bind9-host \    && apt-get clean && rm -rf /var/lib/apt/lists/*# Setup git for testsRUN git config --global user.email "test@project.com" && \    git config --global user.name "Test Project"FROM base as ciENV GOPATH=/workspace/.cache/gopathENV GOCACHE=/workspace/.cache/gocacheRUN mkdir -p /root/.parallel; touch /root/.parallel/will-cite############## COPY CODE ###############COPY go.mod go.sum /workspace/#WORKDIR /workspace#RUN go mod download#COPY ./ /workspace/# A note on folders# /opt/go is where go itself is installed# /opt/gopath is where `go get` installs packages# /opt/gopath is also what `go mod` uses for package cache# /builds is where the current project folder should be mounted运行它:docker.shdocker build -q --target base -t ubuntu-go . ||docker build    --target base -t ubuntu-go .docker run -i -t --rm --init --env-file=.env \  --volume /src/myproject:/workspace:delegated \  --volume /src/myproject/.docker/gopath:/opt/gopath:delegated \  --volume /src/myproject/.docker/gocache:/opt/gocache:delegated \  ubuntu-go "$@"例如$ bash -x docker.sh bash -c 'seq 1 4 ; whoami'+ docker build -q --target base -t ubuntu-go .sha256:03eaf19625efd7f5760d14ea0d741d4454a9f280cd70c5c600bea63bbca70984+ docker run -i -t --rm --init --env-file=.env \  --volume /src/myproject:/workspace:delegated \  --volume /src/myproject/.docker/gopath:/opt/gopath:delegated \  --volume /src/myproject/.docker/gocache:/opt/gocache:delegated \   ubuntu-go bash -c 'seq 1 4 ; whoami'1234root我们的 ldd deps 看起来像这样: linux-vdso.so.1 (…) libpthread.so.0 => /lib64/libpthread.so.0 (…) liblxc.so.1 => /usr/lib64/liblxc.so.1 (…) libutil.so.1 => /lib64/libutil.so.1 (…) libdl.so.2 => /lib64/libdl.so.2 (…) libc.so.6 => /lib64/libc.so.6 (…) /lib64/ld-linux-x86-64.so.2 (…) libcrypto.so.1.1 => /usr/lib64/libcrypto.so.1.1 (…) libseccomp.so.2 => /usr/lib64/libseccomp.so.2 (…) libcap.so.2 => /lib64/libcap.so.2 (…) libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/9.4.0/libgcc_s.so.1 (…)
打开App,查看更多内容
随时随地看视频慕课网APP