【问题标题】:How to upgrade bash via a dockerfile?如何通过 dockerfile 升级 bash?
【发布时间】:2021-08-14 07:55:32
【问题描述】:

我有一个 bash 4.2 的基本映像,我想将其升级到 5.1

我已尝试解压缩,然后将路径变量设置为该文件夹:

RUN curl -o /tmp/bash-5.1.tar.gz ${BASH_URL}/bash/5.1/bash-5.1.tar.gz \
  && tar -xvf /tmp/bash-5.1.tar.gz -C /usr/local/bin \
  && rm /tmp/bash-5.1.tar.gz
ENV PATH=/usr/local/bin/bash-5.1:$PATH

但是,当我构建映像时,其中的所有容器仍然运行 bash 4.2。我也无法在.tar.gz 包中找到像grep 这样的命令,尽管它不在官方网站上,所以我不确定我什至应该在哪里设置PATH。这是tarball的第一层:

ABOUT-NLS    bashline.c    conftypes.h    findcmd.c  lib           parse.y         shell.c      unwind_prot.c
aclocal.m4   bashline.h    copy_cmd.c     findcmd.h  list.c        patchlevel.h    shell.h      unwind_prot.h
alias.c      bashtypes.h   COPYING        flags.c    locale.c      pathexp.c       sig.c        variables.c
alias.h      bracecomp.c   cross-build    flags.h    m4            pathexp.h       sig.h        variables.h
array.c      braces.c      CWRU           general.c  mailcheck.c   pathnames.h.in  siglist.c    version.c
arrayfunc.c  builtins      dispose_cmd.c  general.h  mailcheck.h   pcomplete.c     siglist.h    xmalloc.c
arrayfunc.h  builtins.h    dispose_cmd.h  hashcmd.c  make_cmd.c    pcomplete.h     stringlib.c  xmalloc.h
array.h      ChangeLog     doc            hashcmd.h  make_cmd.h    pcomplib.c      subst.c      Y2K
assoc.c      CHANGES       error.c        hashlib.c  Makefile.in   po              subst.h      y.tab.c
assoc.h      command.h     error.h        hashlib.h  MANIFEST      POSIX           support      y.tab.h
AUTHORS      COMPAT        eval.c         include    mksyntax.c    print_cmd.c     syntax.h
bashansi.h   config-bot.h  examples       input.c    NEWS          quit.h          test.c
bashhist.c   config.h.in   execute_cmd.c  input.h    nojobs.c      RBASH           test.h
bashhist.h   config-top.h  execute_cmd.h  INSTALL    NOTES         README          tests
bashintl.h   configure     expr.c         jobs.c     parser-built  redir.c         trap.c
bashjmp.h    configure.ac  externs.h      jobs.h     parser.h      redir.h         trap.h

我本来希望看到 grepechochmod 等内容。

我的目标只是能够构建一个 dockerfile 并让它运行 bash 5.1。除此部分外,文件中的所有其他内容均有效。

【问题讨论】:

  • 压缩包到底包含什么?您分配的PATH 期望它包含一个目录bash-5.1,该目录应该包含一个字面上称为bash 的二进制文件,以便它实际工作。我猜你误解了PATH 的工作原理;但请随时 edit 澄清您的问题,如果重复不正确,请联系我。
  • @tripleee 我从这个问题stackoverflow.com/questions/51030884/… 得到了使用PATH 的想法我不太清楚我在这里到底在做什么,因为我在互联网上找不到任何东西在图像中升级 bash。
  • 为什么特别需要更新版本的 bash?我的一般经验是,许多东西可以只使用POSIX shell features 重写(在这种情况下,他们甚至可以使用 Alpine 图像中最小的/bin/sh),而那些不能用高级语言表达的东西通常更容易.

标签: bash docker dockerfile


【解决方案1】:

您安装的压缩包根本不包含bash 二进制文件;它包含在您拥有新的bash 之前需要编译和安装的 C 源代码。

另外,如果二进制文件名为bash 并且您将其安装在/usr/local/bin/bash 中,则您的PATH 应该包含/usr/local/bin,而不是单个二进制文件的实际名称。 (见Should PATH contain directories or full paths to binaries?)......但它可能已经这样做了。

所以,非常简短

RUN curl -o /tmp/bash-5.1.tar.gz ${BASH_URL}/bash/5.1/bash-5.1.tar.gz \
  && tar -xvf /tmp/bash-5.1.tar.gz -C /tmp \
  && cd /tmp/bash-5.1 \
  && ./configure --prefix=/usr/local \
  && make \
  && make install
# Probably not actually necessary
ENV PATH=/usr/local/bin:$PATH

但请阅读 tarball 中的 INSTALL 文件,并可能研究您的发行版 Bash 是如何构建的,以便您可以提供相同的配置参数等。

具体的工作方式在某种程度上也取决于您的目标平台。

安装的二进制文件名为bash,而不是grep。如果你想安装一个新版本的grep,那是一个单独的包(GNU coreutils,如果你在 Linux 上)。对于外部命令chmod 也是如此。 echo 是 shell 中的内置命令,因此不会编译成单独的二进制文件。

对于许多 Linux 发行版,安装较新 Bash 的绝对最简单的方法是找到一个二进制存储库,其中包含一个可安装、打包的较新版本,您可以只使用 apt install 或类似版本。

【讨论】:

  • 感谢您分享好的答案(已经 ++ve),我想在这里问一个虚拟问题(对不起,docker 新手),这里的 ${BASH_URL} 是一个 shell 变量还是它来自其他一些 docker 属性文件或者它可以在 docker 文件中直接访问(对不起,如果它是基本问题,因为我不明白所以想问你),谢谢。
  • @RavinderSingh13 也可以。 Dockerfile 可以包含它自己的参数和变量,然后它们对RUN 语句等中的任何 shell 脚本 sn-ps 可见。OP 应该首先在问题中包含完整的 URL 以使其成为更清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多