我正试图构建我的dockerfile,如下所示:
ARG IMG_TAG=latest
# Compile the gaiad binary
FROM golang:1.18-alpine AS gaiad-builder
WORKDIR /usr/src/app
COPY go.mod go.sum* ./
RUN go mod download
COPY . .
ENV PACKAGES curl make git libc-dev bash gcc linux-headers eudev-dev python3
RUN apk add --no-cache $PACKAGES
RUN CGO_ENABLED=0 make install
# Add to a distroless container
FROM distroless.dev/static:$IMG_TAG
ARG IMG_TAG
COPY --from=gaiad-builder /go/bin/gaiad /bin
RUN gaiad init Edima
# && wget https://raw.githubusercontent.com/cosmos/mainnet/master/genesis/genesis.cosmoshub-4.json.gz \
# && gzip -d genesis.cosmoshub-4.json.gz \
# && mv genesis.cosmoshub-4.json ~/.gaia/config/genesis.json
# RUN gaiad start --x-crisis-skip-assert-invariants
EXPOSE 26656 26657 1317 9090
USER 0
ENTRYPOINT ["gaiad", "start"]但是当我运行docker build .时,我得到了一个错误,错误显示如下:
=> ERROR [stage-1 3/3] RUN /bin/gaiad init Edima 0.4s
------
> [stage-1 3/3] RUN /bin/gaiad init Edima:
#16 0.432 container_linux.go:380: starting container process caused: exec: "/bin/sh": stat /bin/sh: no such file or directory
------
executor failed running [/bin/sh -c /bin/gaiad init Edima]: exit code: 1COuld有人帮助解决这个错误吗?
发布于 2022-09-30 00:15:29
“无差异”映像通常只包含极小的库和配置文件集。例如,它不包含shell,因此不能运行shell命令。
对于基于scratch的图像,我习惯于看到这样的方法:在前面的步骤中完成所有必要的设置,然后将COPY内容转换成最终的图像。无论gaiad init做什么工作,如果它可以被合理地构建到一个映像中,那么它应该在前一个阶段完成,然后它的结果COPY就会出现。
FROM golang:1.18-alpine AS gaiad-builder
...
RUN CGO_ENABLED=0 make install
# still in the build stage
ENV HOME=/
RUN /go/bin/gaiad init Enima
FROM distroless.dev/static:$IMG_TAG
# (don't RUN anything in the final "FROM distroless" build stage)
COPY --from=gaiad-builder /go/bin/gaiad /gaiad
COPY --from=gaiad-builder /.gaiad/ /.gaiad/
ENV HOME=/
ENTRYPOINT ["/gaiad", "start"]如果这不是一个选项,那么(像ENTRYPOINT和CMD) RUN指令有两种形式。如果您使用RUN some command,那么Docker会通过一个shell自动运行;但是这个没有差异的映像没有一个shell,这会导致/bin/sh: no such file or directory错误。您还可以将JSON数组传递给RUN,它不调用shell,但也要求您自己手动拆分单词,并且不能执行诸如环境变量替换之类的操作:
RUN ["gaiad", "init", "Edima"]如果这不是一个选项,那么一个不愉快的图像将不适合你。注释暗示希望下载更多文件,并在最终图像中运行一系列命令。由于您使用基于高山的映像构建应用程序,所以可以更改最终图像以匹配。
FROM alpine
COPY --from=gaiad-builder /go/bin/gaiad /bin/
# which includes a POSIX /bin/sh, so this now works again
RUN gaiad init Enimahttps://stackoverflow.com/questions/73902263
复制相似问题