2 回答
TA贡献1836条经验 获得超3个赞
该golang:latest
图像基于 debian bullseye。除了使用此映像构建二进制文件外,您不需要任何其他东西,以便它可以在 ubuntu 上按原样运行。
只需使用这一行而不是您当前使用的来启动您的 dockerfile。
FROM golang:latest
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 "test@project.com" && \
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 (…)
- 2 回答
- 0 关注
- 178 浏览
添加回答
举报