【问题标题】:Using Docker, how to change bash version?使用 Docker,如何更改 bash 版本?
【发布时间】:2018-06-25 19:47:56
【问题描述】:

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

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

ARG base_image
FROM $base_image

RUN # install bash here

ENTRYPOINT bash -c "whatevs"

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

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

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

【问题讨论】:

  • 没试过,但我假设你可以从源代码下载 3 并编译,指定选项使其不与 4 冲突,然后按正常调用它/path/to/install/bash -c "command" ?
  • Bash 的兼容模式可能会有所帮助:shopt -s compat31
  • 我建议您将 Dockerfile 添加到您的问题中。
  • @Cyrus 好主意,我更新了 OP

标签: bash docker docker-build


【解决方案1】:

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

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

或者:

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

如果由于某种原因您不能使用官方镜像,那么使用两个版本的 bash 构建一个镜像可能需要您从源代码中至少安装一个。例如,您可以从具有 bash 4.4.19 的 ubuntu:18.04 开始,然后在 /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.

【讨论】:

  • 是的,谢谢,我投了赞成票,但我应该让我的问题更清楚。基本映像很可能不是 bash:x,所以我需要在从另一个基本映像继承后安装 bash。请参阅 Dockerfile 示例中的注释。
  • 我已经用一个示例更新了答案,该示例使用多阶段构建来生成具有两个 bash 版本的图像(基于 ubuntu)。
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多