【问题标题】:Forward the shell from the base image to child image将 shell 从基础镜像转发到子镜像
【发布时间】:2021-05-31 08:54:52
【问题描述】:

我的项目需要访问私有的 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,所以我可以使用 RUN 执行命令。 但后来我想使用我的代理图像作为基础图像。

使用代理图像的图像:

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 图像转发/传递 shell,以便使用代理图像的图像可以访问 alpine 图像提供的 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

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

【问题讨论】:

  • 听起来你的代理镜像是建好的FROM scratch;如果您需要更多功能,可以将其更改为 FROM ubuntuFROM alpine。你有一个包含两个 Dockerfile 的 minimal reproducible example 吗?
  • 代理图像是使用 golang alpine 图像构建的,我已经编辑了问题以包含文件内容

标签: docker dockerfile alpine


【解决方案1】:

代理镜像的最后阶段构建FROM scratch。正如您所注意到的,它绝对不包含任何内容,甚至没有外壳,因此如果您想将其用作基础映像,您需要将其更改为其他内容:

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 ./
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2017-12-31
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2020-02-26
    • 2017-04-16
    相关资源
    最近更新 更多