在scratch Docker映像上安装Bash

在scratch Docker映像上安装Bash,docker,dockerfile,Docker,Dockerfile,我目前正在使用第三方Docker映像,其Dockerfile基于空映像,从指令开始 如何在这样的映像上安装Bash?我尝试向Docker文件添加一些额外的命令,但显然RUN指令本身需要Bash。当您从头开始创建Docker映像时,您将一无所获。通常,处理其中一个文件的方法是在主机上构建一个静态二进制文件(或者现在处于早期Dockerfile构建阶段),然后将其复制到映像中 FROM scratch COPY mybinary / ENTRYPOINT ["/mybinary"] 没有任何东西可

我目前正在使用第三方Docker映像,其Dockerfile基于空映像,从指令开始


如何在这样的映像上安装Bash?我尝试向Docker文件添加一些额外的命令,但显然
RUN
指令本身需要Bash。

当您从头开始创建Docker映像
时,您将一无所获。通常,处理其中一个文件的方法是在主机上构建一个静态二进制文件(或者现在处于早期Dockerfile构建阶段),然后
将其复制到映像中

FROM scratch
COPY mybinary /
ENTRYPOINT ["/mybinary"]
没有任何东西可以阻止您创建派生映像并
复制
其他二进制文件到其中。要么您必须专门构建一个静态二进制文件,要么安装一个完整的动态库环境


如果您这样做是为了调试容器,那么图像中可能没有其他内容。这意味着,你可以用一个shell做的一系列事情都很无聊。另一个问题是,您不会拥有您习惯的标准工具集(没有
ls
cp
)。如果你可以不使用bash的各种扩展,它是一个设计用于静态构建和安装在有限环境中的小工具,提供了这些标准工具的最低版本。

这个问题很老了,但我看到了一个类似的问题,我来到了这里,所以在下面的文章中讨论这种情况

我目前正在与第三方Docker映像合作,该映像 Dockerfile基于空图像,从零开始 指令

正如@David所提到的,在这样的图像中没有任何基于scratch的内容,如果图像基于scratch图像,那么他们只需将二进制文件复制到图像中,就是这样

因此,使用这种图像的方法是将二进制文件复制到扩展图像中,并在所需的docker图像中使用它们

比如说

所以这是基于scratch的,我不能安装bash或者其他任何东西,我只能复制二进制文件来运行

这就是工作,将它们用作多级基本映像,将二进制文件和安装的软件包复制到docker映像中

下面我们需要添加等待

FROM wrouesnel/postgres_exporter 
# use the above base image
FROM debian:7.11-slim
RUN useradd -u 20001 postgres_exporter
USER postgres_exporter
#copy binires 
COPY --from=0 /postgres_exporter /postgres_exporter
EXPOSE 9187
COPY wait-for-it.sh wait-for-it.sh
USER root
RUN chmod +x wait-for-it.sh
USER postgres_exporter
RUN pwd
ENTRYPOINT ["./wait-for-it.sh", "db:5432", "--", "./postgres_exporter"]

从头开始用于构建基本操作系统。请参见如何准备alpine docker映像的示例。@fly2matrix这有什么帮助?Bash是一个系统级命令解释器(shell)。它作为操作系统内核层的包装器运行。所以你必须有一个操作系统。如果您想展示一个从头开始的
示例
,那么添加一个zip文件,就像在alpine中那样,使用最小/小型操作系统来满足该要求,然后安装BASH。
FROM wrouesnel/postgres_exporter 
# use the above base image
FROM debian:7.11-slim
RUN useradd -u 20001 postgres_exporter
USER postgres_exporter
#copy binires 
COPY --from=0 /postgres_exporter /postgres_exporter
EXPOSE 9187
COPY wait-for-it.sh wait-for-it.sh
USER root
RUN chmod +x wait-for-it.sh
USER postgres_exporter
RUN pwd
ENTRYPOINT ["./wait-for-it.sh", "db:5432", "--", "./postgres_exporter"]