Невозможно настроить код с помощью echo в Docker с Alpine OS, но можно в Ubuntu - PullRequest
1 голос
/ 30 марта 2019

У меня есть Dockerfile, который изначально тянул из Ubuntu, и недавно я натолкнулся на Alpine, который является более легким, так что я хотел бы использовать его вместо этого. Часть кода, которую я пытаюсь создать, называется Healpix , что зависит от cfitsio . Когда я изначально создавал версию Ubuntu, я нашел этот Dockerfile https://github.com/MilesCranmer/dockers/blob/master/dockerfiles/healpix.

По сути, проблема заключается в следующих работах в Ubuntu, но не в Alpine:

RUN echo "3\ngfortran\n\nY\n\n\ngcc\n\n\n\n\nN\n1\nY\nN\nN\n0\n" |
    ./configure && make

Я получаю ошибку

Something went wrong ...
Quitting configuration script !

./configure: exit: line 162: Illegal number: -1
The command '/bin/sh -c echo     "3\ngfortran\n\nY\n\n\ngcc\n\n\n\n\nN\n1\nY\nN\nN\n0\n" | ./configure     && make' returned a non-zero code: 2

несколько странно, что рассматриваемый скрипт конфигурации не имеет длины 162 строки https://sourceforge.net/p/healpix/code/HEAD/tree/branches/branch_v350r1006/configure. Я попытался установить bash и изменить скрипт на него, но это не сработало.

Ubuntu Dockerfile

FROM ubuntu
RUN apt-get update && apt-get install -y gcc g++ gfortran make wget
WORKDIR /home
RUN wget \ 
   http://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c/cfitsio_latest.tar.gz \
   && tar xzf cfitsio_latest.tar.gz
WORKDIR cfitsio
RUN ./configure --prefix=/usr && make && make install
WORKDIR /home
RUN wget \
   https://sourceforge.net/projects/healpix/files/Healpix_3.50/Healpix_3.50_2018Dec10.tar.gz \
   && tar xzf Healpix*.tar.gz
WORKDIR Healpix_3.50
RUN echo \
    "3\ngfortran\n\nY\n\n\ngcc\n\n\n\n\nN\n1\nY\nN\nN\n0\n" | ./configure \
    && make

Альпийский Dockerfile

FROM alpine
RUN apk --no-cache add gcc g++ gfortran make wget
WORKDIR /home
RUN wget \ 
   http://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c/cfitsio_latest.tar.gz \
   && tar xzf cfitsio_latest.tar.gz
WORKDIR cfitsio
RUN ./configure --prefix=/usr && make && make install
WORKDIR /home
RUN wget \
   https://sourceforge.net/projects/healpix/files/Healpix_3.50/Healpix_3.50_2018Dec10.tar.gz \
   && tar xzf Healpix*.tar.gz
WORKDIR Healpix_3.50
RUN echo \
    "3\ngfortran\n\nY\n\n\ngcc\n\n\n\n\nN\n1\nY\nN\nN\n0\n" | ./configure \
    && make

1 Ответ

2 голосов
/ 30 марта 2019

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).

...