将 shell 或 bash 添加到 docker 镜像(基于 Debian GNU/Linux 的 Distroless)

egr*_*rey 5 bash glibc docker dockerfile docker-entrypoint

我想添加shellbash到我的图像以执行安装命令。

我已将/bin/bashVM 上的复制到我的映像上Dockerfile

COPY /bin/bash /bin/
Run Code Online (Sandbox Code Playgroud)

但是当我执行 docker 命令时:

 docker run -it --entrypoint "/bin/bash" <my_image>
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

/bin/bash: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory

谢谢你的帮助

aoe*_*oee 29

您可以通过在 Dockerfile 的多阶段构建中从官方busybox映像复制静态编译的 shell 来完成此操作。或者只是COPY --from它。

静态 shell 没有太多依赖项,因此它适用于一系列不同的基础映像。它可能不适用于某些高级案例,但除此之外它可以完成工作。

静态编译的 shell 带有uclibc. 根据您的基本映像,您busybox也可能会在其他风格上取得成功。

例子:

FROM busybox:1.35.0-uclibc as busybox

FROM gcr.io/distroless/base-debian11

# Now copy the static shell into base image.
COPY --from=busybox /bin/sh /bin/sh

# You may also copy all necessary executables into distroless image.
COPY --from=busybox /bin/mkdir /bin/mkdir
COPY --from=busybox /bin/cat /bin/cat

ENTRYPOINT ["/bin/sh", "/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

直接来自图像的单行COPY --from也可以工作:

FROM gcr.io/distroless/base-debian11

COPY --from=busybox:1.35.0-uclibc /bin/sh /bin/sh

ENTRYPOINT ["/bin/sh", "/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)


mir*_*phd 10

Google 的 distroless 映像具有标记为 的版本debug,其中包含busybox可执行文件(sh捆绑在一起)。

如果必须的话,甚至可以在生产中使用它们(这违背了提高安全性的目的 - 例如隐藏环境变量和保护脚本化应用程序代码)。

distroless/base带标签的图像的使用示例debug

$ docker run -it --rm --name base -u 0 gcr.io/distroless/base:debug
/ # id
uid=0(root) gid=0(root)
Run Code Online (Sandbox Code Playgroud)


Yas*_*sen 8

那是因为您尝试bashdocker不使用动态编译的情况下使用动态编译glibc支持的情况下使用动态编译。

\n

长话短说

\n
    \n
  • ...要么使用bash-static而不是经典bash\n您可以下载它或运行./build.sh
  • \n
  • 或添加bashalpine将此行添加到您的DockerfileRUN apk add --no-cache bash
  • \n
\n

Alpine是一个musl基于 - 的发行版

\n

许多 docker 镜像都是使用alpine基础镜像构建的:\nalpine(通常)小而快:

\n

以下是流行操作系统的映像大小。

\n

图像大小的差异\n来源: Dockerhub 操作系统细分

\n
\n

图像大小的差异是惊人的:范围从 1MB 的 BusyBox 一直到 230MB 的 Fedora。看到聚类的发生很有趣。Alpine 和 BusyBox 是轻量级的,接近 0MB,然后是 Debian 和 Ubuntu 等中量级的,大约为 100MB,最大的是 CentOS 和 Oracle Linux 等重量级的,高达 200MB。

\n
\n

musl不包含libtinfo

\n

查看更多关于glibc和之间的区别musl 与 glibc 的功能差异

\n

PS你可以运行bash-staticPS你甚至可以在空容器中scratch

\n
FROM scratch\nADD bash\nENTRYPOINT [\'/bash\']\n
Run Code Online (Sandbox Code Playgroud)\n

您现在可以添加 busybox 了。

\n

  • 我已在 Dockerfile 上添加了命令:'RUN apk add --no-cache bash' 但出现此错误: 步骤 4/5 : RUN apk add --no-cache bash ---&gt; 在 99bf0a92c050 OCI 运行时创建中运行失败:container_linux.go:348:启动容器进程导致“exec:\”/ bin / sh \“:stat / bin / sh:没有这样的文件或目录”:未知 (2认同)
  • 如果无法使用 shell,如何执行“apk”命令?distroless docker 镜像没有 shell。 (2认同)