将 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 ./
...
我的项目需要访问私有 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 ./
...