TL; DR
В вашем Dockerfile
используйте:
RUN /bin/echo -e "3\ngfortran\n[...]" | ./configure && make
для одинакового поведения в Ubuntu и Alpine.
Пояснения
Сценарий ./configure
выполняется с /bin/sh
(см. Шебанг). В Ubuntu /bin/sh
- это ссылка на /bin/dash
, а в Alpine /bin/sh
- это ссылка на /bin/busybox
.
Следующий небольшой пример воспроизводит вашу проблему.
Рассмотрим следующий ./configure
скрипт:
#!/bin/sh
read -p "1st prompt : " first
read -p "2nd prompt : " second
echo "$first-$second"
В Ubuntu:
docker run --rm -v $PWD/configure:/configure ubuntu:18.04 \
/bin/sh -c 'echo "a\nb" | ./configure'
отпечатков:
а-б
В то время как на Alpine:
docker run --rm -v $PWD/configure:/configure alpine:3.8 \
/bin/sh -c 'echo "a\nb" | ./configure'
отпечатков:
anb-
В Alpine (busybox
) строка echo
ed (a\nb
) интерпретируется как один аргумент, а в Ubuntu (dash
) \n
используется для разделения обоих аргументов.
Чтобы иметь то же поведение, что и Ubuntu на Alpine, вы можете запустить:
docker run --rm -v $PWD/configure:/configure alpine:3.8 /bin/sh -c 'echo "a
b
" | ./configure'
или:
docker run --rm -v $PWD/configure:/configure alpine:3.8 /bin/sh -c \
'echo -e "a\nb" | ./configure'
(см. Параметр -e
в echo
)
Эти 2 команды печатают:
а-б
Что касается Dockerfile
, вы должны написать что-то вроде:
RUN /bin/echo -e "3\ngfortran\n[...]" | ./configure && make
/bin/echo
используется вместо echo
, потому что в Ubuntu echo -e "3\ngfortran\n[...]"
выведет -e 3\nngfortran\n[...]
.
Это потому, что echo
анализируется встроенной оболочкой, а /bin/echo
явно нет (источник: https://github.com/moby/moby/issues/8949#issuecomment-61682684).