【问题标题】:Add shell or bash to a docker image (Distroless based on Debian GNU/Linux)将 shell 或 bash 添加到 docker 映像(基于 Debian GNU/Linux 的 Distroless)
【发布时间】:2020-07-17 06:36:21
【问题描述】:

我想在我的镜像中添加shellbash 来执行安装命令。

我已将 VM 上的 /bin/bash 复制到 Dockerfile 上的映像中:

COPY /bin/bash /bin/

但是当我执行docker命令时:

 docker run -it --entrypoint "/bin/bash" <my_image>

然后我收到以下错误:

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

感谢您的帮助

【问题讨论】:

  • 您能否扩展这个问题以包含minimal reproducible example,尤其是包含Dockerfile 的FROM 行? (它是“无发行版”,还是“基于 Debian 发行版”?)您通常如何将软件安装到此映像中? (它是否包括某种包管理器?)
  • 嗨@DavidMaze,在我的Dokerfile上,我从基于带有nginx配置的distroless的api-gate-way映像开始

标签: bash docker dockerfile glibc docker-entrypoint


【解决方案1】:

那是因为您试图在没有 glibc 支持的情况下在 docker 中使用动态编译的 bash

TL;DR

  • ...要么使用bash-static 而不是经典的bash 你可以download它或运行./build.sh
  • 或为alpine添加bash:将此行添加到您的DockerfileRUN apk add --no-cache bash

Alpine 是一个基于 musl 的发行版

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

以下是流行操作系统的图片尺寸。

来源:A Breakdown of Operating Systems of Dockerhub

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

musl 不包含 libtinfo

详细了解glibcmusl Functional differences from glibc 之间的区别

附注您甚至可以在 scratch 的空容器中运行 bash-static

FROM scratch
ADD bash
ENTRYPOINT ['/bash']

您现在可以添加busybox。

【讨论】:

  • 感谢您的留言@Yasen。我会试试这个'RUN apk add --no-cache bash'
  • 我已经在我的 Dockerfile 上添加了命令:'RUN apk add --no-cache bash' 但我有这个错误:步骤 4/5:RUN apk add --no-cache bash -- -> 在 99bf0a92c050 OCI 运行时创建失败:container_linux.go:348:启动容器进程导致“exec:\”/bin/sh\“:stat /bin/sh:没有这样的文件或目录”:未知
  • 如果不能使用shell,如何执行“apk”命令? distroless docker 镜像没有 shell。
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 2017-04-18
  • 2016-10-24
  • 2018-09-23
  • 2020-01-21
  • 1970-01-01
  • 2020-10-19
  • 2020-05-28
相关资源
最近更新 更多