Как изменить версию bash с помощью Docker?

Кто-нибудь знает надежный способ переключения между Bash версии 3 и Bash версии 4 в контейнере Docker?

В целях тестирования я хочу запустить один контейнер с версией 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"  .

person Alexander Mills    schedule 25.06.2018    source источник
comment
Не пробовал, но я предполагаю, что вы можете загрузить 3 из исходников и скомпилировать, указав параметры, чтобы они не конфликтовали с 4, а затем вызвать его как обычно /path/to/install/bash -c "command"?   -  person Keenan Lawrence    schedule 25.06.2018
comment
Режим совместимости с Bash может помочь: shopt -s compat31   -  person Cyrus    schedule 25.06.2018
comment
Я предлагаю вам добавить свой Dockerfile к вашему вопросу.   -  person Cyrus    schedule 25.06.2018
comment
@Cyrus хорошая идея, я обновил OP   -  person Alexander Mills    schedule 26.06.2018


Ответы (1)


Уже есть официальные образы bash для всех версий, поэтому вы можете просто:

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

Or:

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

Если по какой-то причине вы не можете использовать официальные образы, создание одного образа с двумя версиями bash, вероятно, потребует установки хотя бы одного из исходников. Например, вы можете начать с ubuntu:18.04, в котором есть bash 4.4.19, а затем собрать и установить другую версию в /usr/local.


Если вы хотите собрать и установить Bash самостоятельно, вам понадобятся:

  • Функционирующая среда разработки (компилятор C, make, autoconf и т. Д.)
  • Исходники bash

На самом деле это отличная ситуация для использования многоступенчатой ​​сборки, поскольку вы не обязательно хотите, чтобы среда сборки загромождала финальное изображение. Вот один из способов решить эту проблему:

##
## 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.
person larsks    schedule 25.06.2018
comment
да, спасибо, я проголосовал за, но мне следовало сделать свой вопрос более ясным. Скорее всего, базовый образ будет отличным от bash: x, поэтому мне нужно будет установить bash после наследования от другого базового образа. См. Комментарий в примере Dockerfile. - person Alexander Mills; 26.06.2018
comment
Я обновил ответ примером, в котором используются многоступенчатые сборки для создания изображения (на основе ubuntu) с двумя версиями bash. - person larsks; 26.06.2018