将 shell 从基本图像转发到子图像

Forward the shell from the base image to child image

我的项目需要访问私有 go 模块并访问它需要 GOPROXY 的模块。 所以我从基本图像 golang alpine

创建了一个图像

代理图像:

FROM golang:1.16.4-alpine3.13 AS builder

ARG GITLAB_LOGIN
ARG GITLAB_TOKEN

modules.
WORKDIR /app

ENV GO111MODULE="auto"
ENV GONOSUMDB=*.someting.text
ENV GOPROXY=https://proxy.golang.org,direct
ENV GOPRIVATE="gitlab.something.text"
#ARG GOPROXY=http://localhost:41732,https://proxy.golang.org,direct
RUN apk add --no-cache git

RUN echo "machine gitlab.something.text login ${GITLAB_LOGIN} password ${GITLAB_TOKEN}" > ~/.netrc

COPY ["go.mod", "go.sum", "./"]
RUN go mod download

COPY . .

RUN CGO_ENABLED=0 go build \
    -installsuffix 'static' \
    -o /app/proxy .

FROM scratch AS final

COPY --from=builder /app /app
CMD [ "/app/proxy"]

并且 alpine 图像有一个 shell,因此我可以使用 运行 执行命令。 但是后来我想使用我的代理图像作为基础图像。

使用代理图像的图像:

FROM proxy:latest

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .
RUN go build -o bin/app .

CMD [ "/app" ]

然后使用代理图像的图像无法访问 shell。 所以我的问题是,有没有办法通过代理图像从基础 alpine 图像 forward/pass shell 以便使用代理图像的图像可以访问由提供的 shell高山形象。

导致我在使用代理图像作为基础的图像中得到的错误是

CI runtime create failed: container_linux.go:380: starting container process caused: exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown

但是当然这个错误不会发生在代理图像中,因为它的基础图像是高山的。

代理图像的最后阶段已构建FROM scratch。正如您所注意到的,它完全不包含任何内容,甚至没有 shell,因此如果您想将其用作基本图像,则需要将其更改为其他内容:

FROM golang:1.16.4-alpine3.13 AS builder
...
FROM alpine:3.13 # AS final
COPY --from=builder /app/proxy /usr/local/bin/proxy
CMD ["proxy"]

但是,您的 Go 构建序列会生成一个静态二进制文件;如果它可以 运行 作为 FROM scratch 图像中唯一的东西成功,那么它可以 运行 在任何 Linux 环境中成功。您可以 COPY --from 图像以及构建阶段。不使用代理作为基础图像可能更容易,而是将其复制到您需要的其他图像中:

FROM golang # not the proxy
# Get the proxy binary from the other image
COPY --from=proxy /app/proxy /usr/local/bin
# Build the Go application as above
COPY go.mod go.sum ./
...