首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启动容器进程: exec:"/bin/sh":stat /bin/sh:没有这样的文件或目录--执行器运行[/bin/sh -c ]失败

启动容器进程: exec:"/bin/sh":stat /bin/sh:没有这样的文件或目录--执行器运行[/bin/sh -c ]失败
EN

Stack Overflow用户
提问于 2022-09-29 22:27:05
回答 1查看 159关注 0票数 0

我正试图构建我的dockerfile,如下所示:

代码语言:javascript
复制
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 .时,我得到了一个错误,错误显示如下:

代码语言:javascript
复制
 => 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: 1

COuld有人帮助解决这个错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-30 00:15:29

“无差异”映像通常只包含极小的库和配置文件集。例如,它不包含shell,因此不能运行shell命令。

对于基于scratch的图像,我习惯于看到这样的方法:在前面的步骤中完成所有必要的设置,然后将COPY内容转换成最终的图像。无论gaiad init做什么工作,如果它可以被合理地构建到一个映像中,那么它应该在前一个阶段完成,然后它的结果COPY就会出现。

代码语言:javascript
复制
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"]

如果这不是一个选项,那么(像ENTRYPOINTCMD) RUN指令有两种形式。如果您使用RUN some command,那么Docker会通过一个shell自动运行;但是这个没有差异的映像没有一个shell,这会导致/bin/sh: no such file or directory错误。您还可以将JSON数组传递给RUN,它不调用shell,但也要求您自己手动拆分单词,并且不能执行诸如环境变量替换之类的操作:

代码语言:javascript
复制
RUN ["gaiad", "init", "Edima"]

如果这不是一个选项,那么一个不愉快的图像将不适合你。注释暗示希望下载更多文件,并在最终图像中运行一系列命令。由于您使用基于高山的映像构建应用程序,所以可以更改最终图像以匹配。

代码语言:javascript
复制
FROM alpine
COPY --from=gaiad-builder /go/bin/gaiad /bin/
# which includes a POSIX /bin/sh, so this now works again
RUN gaiad init Enima
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73902263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档