我目前正在使用第三方Docker镜像,它的Dockerfile基于空镜像,从FROM scratch指令开始。
如何在这样的镜像上安装Bash?我尝试向Dockerfile中添加一些额外的命令,但显然RUN指令本身需要Bash。
发布于 2018-08-24 19:17:57
当你启动一个Docker镜像FROM scratch时,你什么都得不到。通常,您使用其中之一的方式是在您的主机上构建一个静态二进制文件(或者现在在早期Dockerfile构建阶段),然后将其COPY到镜像中。
FROM scratch
COPY mybinary /
ENTRYPOINT ["/mybinary"]没有什么能阻止你创建一个派生镜像并将额外的二进制文件COPY到其中。要么你必须专门构建一个静态二进制文件,要么安装一个完整的动态库环境。
如果您这样做是为了尝试调试容器,则映像中可能没有其他内容。这意味着你可以用shell做的一系列事情都很无聊。另一个原因是你将不会拥有你所习惯的标准工具集(没有ls或cp)。如果您可以不使用bash的各种扩展,那么BusyBox是一个小型工具,可以在有限的环境中静态构建和安装,它提供了大多数标准工具的最小版本。
发布于 2019-10-04 13:22:26
这个问题是旧的,但我看到了类似的问题,并来到这里,所以在下面张贴来处理这种情况。
我目前正在使用第三方Docker镜像,它的Dockerfile基于空镜像,从scratch指令开始。
正如@David提到的那样,这种镜像中没有基于scratch的东西,如果镜像是基于scratch镜像的,他们只是将二进制文件复制到镜像中,仅此而已。
因此,使用这类镜像的技巧是将二进制文件复制到扩展镜像中,并在所需的docker镜像中使用它们。
FROM scratch
ARG binary
COPY $binary /postgres_exporter
EXPOSE 9187
ENTRYPOINT [ "/postgres_exporter" ]所以这是基于scratch的,我不能安装bash或其他任何东西,我只能复制二进制文件来运行。
所以这里的工作是,使用它们作为多阶段基础镜像,复制二进制文件和已安装的包到您的docker镜像中。
下面我们需要添加wait-for-it
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"]https://stackoverflow.com/questions/52001121
复制相似问题