You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker构建Distroless镜像报错:/bin/sh不存在,求解决方案

解决Docker构建时/bin/sh不存在的错误

问题原因

你使用的distroless.dev/static:$IMG_TAG是无Shell的极简静态镜像,Docker的RUN命令默认会通过/bin/sh解析执行命令,但该镜像中不包含任何Shell环境,因此执行RUN gaiad init Edima时会报错找不到/bin/sh。

解决方案

方案1:改用带Shell的Distroless镜像

将第二阶段的基础镜像替换为包含Shell的版本,比如distroless.dev/base或distroless.dev/debug,这类镜像内置了必要的Shell环境:

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

# 改用带Shell的distroless镜像
FROM distroless.dev/base:$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 

EXPOSE 26656 26657 1317 9090
USER 0

ENTRYPOINT ["gaiad", "start"]

方案2:在构建阶段完成初始化,保持静态镜像极简

如果希望继续使用distroless.dev/static镜像(保持最小体积),可以在gaiad-builder阶段完成配置文件的初始化生成,再将配置目录复制到目标镜像中:

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

# 在builder阶段执行初始化,生成配置文件
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 

# 使用静态distroless镜像
FROM distroless.dev/static:$IMG_TAG
ARG IMG_TAG
COPY --from=gaiad-builder /go/bin/gaiad /bin
# 复制builder阶段生成的配置目录到目标镜像
COPY --from=gaiad-builder /root/.gaia /root/.gaia

EXPOSE 26656 26657 1317 9090
USER 0

ENTRYPOINT ["gaiad", "start"]

方案对比

  • 方案1:操作简单,无需调整构建流程,但镜像体积会比static版本略大。
  • 方案2:保持镜像极简特性,但需要在构建阶段提前完成所有配置操作,适合对镜像体积有严格要求的场景。

内容的提问来源于stack exchange,提问作者Samuel Arogbonlo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:40:45