亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何構建不鏈接到 musl libc 的 go 可執行文件

如何構建不鏈接到 musl libc 的 go 可執行文件

Go
藍山帝景 2023-06-05 17:15:13
所以:官方 Go 構建容器基于 Alpine。Alpine 使用musl作為 libc 而不是 glibc。我需要在可以在使用 glibc 的 Ubuntu 上運行的容器中構建一個 Go 可執行文件。我怎么辦使官方 GoLang 構建容器使用 glibc 或在基于 Ubuntu 的容器上構建我的 GoLang 項目我不能使用Disable CGO解決方案,因為我的 Go 代碼是 FUSE 驅動程序,它需要 CGO
查看完整描述

2 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

golang:latest圖像基于 debian bullseye。除了使用此映像構建二進制文件外,您不需要任何其他東西,以便它可以在 ubuntu 上按原樣運行。

只需使用這一行而不是您當前使用的來啟動您的 dockerfile。

FROM golang:latest


查看完整回答
反對 回復 2023-06-05
?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

從 Ubuntu 基礎映像開始,并在其中設置 golang。發現它們時添加依賴項。如果你不太關心go的版本,那么Ubuntu的官方包就可以了,你不必下載官方的go release。


這對我們有用(linux / mac 用戶):


文件


FROM ubuntu:20.04 as base


ARG BUILDPLATFORM

ARG TARGETPLATFORM

RUN echo "Building for $TARGETPLATFORM on $BUILDPLATFORM"


# Enable super fast apt caches for use with buildkit --mount=type=cache

RUN 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.md

RUN --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.15

ARG TARGETARCH

ADD https://dl.google.com/go/go${GOVERSION}.linux-${TARGETARCH}.tar.gz /tmp/golang.tar.gz

RUN cd /opt && tar zxf /tmp/golang.tar.gz && rm /tmp/golang.tar.gz


# Set timezone to UTC

RUN echo 'UTC' > /etc/timezone && \

    dpkg-reconfigure -f noninteractive tzdata


# Set up go environment variables

ENV GOPATH=/opt/gopath

ENV GOCACHE=/opt/gocache

ENV GOROOT=/opt/go

ENV 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 builds

RUN 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 code

RUN go get honnef.co/go/tools/cmd/staticcheck && \

    mv $GOPATH/bin/staticcheck $GOROOT/bin/staticcheck


# Install https://github.com/kyoh86/richgo for pretty color output

RUN go get -u github.com/kyoh86/richgo && \

    mv $GOPATH/bin/richgo $GOROOT/bin/richgo


# Set up working dir for this project

WORKDIR /workspace


#########

# TESTS #

#########


# Install dependencies for running tests

RUN --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 tests

RUN git config --global user.email "[email protected]" && \

    git config --global user.name "Test Project"



FROM base as ci

ENV GOPATH=/workspace/.cache/gopath

ENV GOCACHE=/workspace/.cache/gocache


RUN 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.sh


docker 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'

1

2

3

4

root

我們的 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 (…)


查看完整回答
反對 回復 2023-06-05
  • 2 回答
  • 0 關注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號