【发布时间】: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 ubuntu或FROM alpine。你有一个包含两个 Dockerfile 的 minimal reproducible example 吗? -
代理图像是使用 golang alpine 图像构建的,我已经编辑了问题以包含文件内容
标签: docker dockerfile alpine