/bin/sh: xxx not found?

在mac上编译golang项目,一开始使用如下dockerfile进行构建镜像:

# syntax=docker/dockerfile:1
FROM golang:1.20-alpine
ENV PATH=/app
WORKDIR $PATH
COPY service $PATH
CMD ["service"]

容器运行后发现只能通过sh进入容器,无法通过bash进入,以及这个sh好像不支持常用命令:

/app # ls
/bin/sh: ls: not found
/app # top -c
/bin/sh: top: not found

搜索了相关问题,说是要在镜像中加入bash

修改dockerfile

# syntax=docker/dockerfile:1
FROM golang:1.20-alpine
ENV PATH=/app
WORKDIR $PATH
RUN apk update \
    && apk upgrade \
    && apk add --no-cache bash \
    && apk add --no-cache bash-doc \
    && apk add --no-cache bash-completion \
    && rm -rf /var/cache/apk/* \
COPY service $PATH
CMD ["service"]

但是构建时报错:

=> ERROR [3/3] RUN apk update
    && apk upgrade
    && apk add --no-cache bash
    && apk add --no-cache bash-doc
    && apk add --no-cache bash-completion
    && rm -rf /var/cache/apk/*
    COPY mail /  
    0.2s
------
> [3/3] RUN apk update
        && apk upgrade
        && apk add --no-cache bash
        && apk add --no-cache bash-doc
        && apk add --no-cache bash-completion
        && rm -rf /var/cache/apk/*
        COPY mail /app:
#12 0.161 /bin/sh: apk: not found
------
executor failed running [
    /bin/sh -c apk update
    && apk upgrade
    && apk add --no-cache bash
    && apk add --no-cache bash-doc
    && apk add --no-cache bash-completion
    && rm -rf /var/cache/apk/*
    COPY mail $PATH
]: 
exit code: 127

请问这是为何呢?


已解决

问题出在了Dockerfile中的这一行:

ENV PATH=/app

这行起初准备将工作目录定义为一个变量,但是却使用了PATH这个名称,而PATH是特指环境变量的,这个冲突导致了后续的一系列问题。

换个变量名,上述问题全部解决:

ENV WD=/app

以及

go交叉编译后的可执行二进制文件,完全不需要再基于golang镜像来构建了,直接基于alpine镜像构建即可:

# syntax=docker/dockerfile:1
FROM alpine
ENV WD=/app
WORKDIR $WD
COPY service $WD
CMD ["service"]

如果部署后确定没有进入容器操作的需求,甚至可以再激进一些,直接基于空镜像构建:

# syntax=docker/dockerfile:1
FROM scratch
ENV WD=/app
WORKDIR $WD
COPY service $WD
CMD ["service"]
阅读 2.6k
1 个回答

docker镜像一般都会保持相当精简。有些甚至默认不会带vim。

所以 golang:1.20-alpine 没有apk命令也很正常。

你可以选择其他镜像来做,不过一般会比这个体积大一些。


本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题