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
相关产品推荐
相关产品推荐

