使用 Docker,如何更改 bash 版本?

Using Docker, how to change bash version?

有人知道在 Docker 容器中在 Bash 版本 3 和 Bash 版本 4 之间切换的可靠方法吗?

出于测试目的,我想 运行 一个版本为 3 的容器和一个版本为 4 的容器,但从技术上讲,我不需要切换版本,只需要构建一个包含两个不同版本的映像.

ARG base_image
FROM $base_image

RUN # install bash here

ENTRYPOINT bash -c "whatevs"

就我而言,我最关心 Debian/Ubuntu 基本图像。但我想找到一个通用的 bash 安装命令会很有趣,它可以适用于大多数(如果不是所有)*nix 机器。

顺便说一句,上面的语法是创建通用基础映像的方法,您可以像这样构建它:

docker build -t foo --build-arg base_image="$base_image"  .

所有版本已经 official bash images,所以您可以:

docker run -it bash:4.4 -c 'whatevs'

或者:

docker run -it bash:3.2 -c 'whatevs'

如果由于某种原因您不能使用官方图像,构建具有两个版本 bash 的单个图像可能需要您至少从源安装一个。例如,您可以从 ubuntu:18.04 开始,它有 bash 4.4.19,然后构建并安装另一个版本到 /usr/local.


如果您想自己构建和安装 Bash,您将需要:

  • 一个正常运行的开发环境(C 编译器、makeautoconf 等)
  • bash 来源

这实际上是使用 multi-stage build 的好情况,因为您不一定希望构建环境弄乱最终图像。这是解决它的一种方法:

##
## Build bash 3
##

FROM ubuntu:18.04 as bash_3
ARG bash_3_version=3.2.57
RUN apt-get update
RUN apt-get -y install build-essential curl bison

WORKDIR /tmp
RUN curl -o bash-${bash_3_version}.tar.gz \
  http://ftp.gnu.org/gnu/bash/bash-${bash_3_version}.tar.gz
RUN tar xf bash-${bash_3_version}.tar.gz

WORKDIR /tmp/bash-${bash_3_version}
RUN ./configure --prefix=/opt/bash3
RUN make EXEEXT=3
RUN make install EXEEXT=3

##
## Build bash 4
##

FROM ubuntu:18.04 as bash_4
ARG bash_4_version=4.4.18
RUN apt-get update
RUN apt-get -y install build-essential curl bison

WORKDIR /tmp
RUN curl -o bash-${bash_4_version}.tar.gz \
  http://ftp.gnu.org/gnu/bash/bash-${bash_4_version}.tar.gz
RUN tar xf bash-${bash_4_version}.tar.gz

WORKDIR /tmp/bash-${bash_4_version}
RUN ./configure --prefix=/opt/bash4
RUN make EXEEXT=4
RUN make install EXEEXT=4

##
## Build the final image
##

FROM ubuntu:18.04

ENV PATH=/opt/bash4/bin:/opt/bash3/bin:/bin:/usr/bin:/usr/local/bin
COPY --from=bash_3 /opt/bash3 /opt/bash3
COPY --from=bash_4 /opt/bash4 /opt/bash4

如果您使用它来构建一个名为 basher 的图像,那么您可以...

$ docker run -it --rm basher bash3 --version
GNU bash, version 3.2.57(1)-release (x86_64-unknown-linux-gnu)   
Copyright (C) 2007 Free Software Foundation, Inc.

并且:

$ docker run -it --rm basher bash4 --version             
GNU bash, version 4.4.18(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.