无法在具有Alpine操作系统的docker中配置带有回显的代码,但可以在ubuntu中进行配置

时间:2019-03-30 12:39:36

标签: docker ubuntu alpine

我有一个Dockerfile,该文件最初是从ubuntu中提取的,最近我遇到了更轻巧的alpine,因此想从中提取它。我尝试构建的部分代码称为Healpix,它取决于cfitsio。当我最初构建ubuntu版本时,我发现了这个Dockerfile https://github.com/MilesCranmer/dockers/blob/master/dockerfiles/healpix

本质上,问题是在ubuntu中有以下工作,但不适用于高山:

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 个答案:

答案 0 :(得分:2)

TL; DR

在您的Dockerfile中,使用:

RUN /bin/echo -e "3\ngfortran\n[...]" | ./configure && make

在Ubuntu和Alpine上具有相同的行为。

说明

./configure脚本是通过/bin/sh执行的(请参阅shebang)。在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'

打印:

  

a-b

在高山上:

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)上,{{1 }}用于分隔两个参数。

要与Alpine上的Ubuntu具有相同的行为,可以运行:

\n

或:

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' 的{​​{1}}参数)

这2条命令显示为:

  

a-b

对于您的-e,您应该编写类似:

echo

Dockerfile代替了RUN /bin/echo -e "3\ngfortran\n[...]" | ./configure && make ,因为在Ubuntu上,/bin/echo将打印echo

  

这是因为echo -e "3\ngfortran\n[...]"被解析为内置的shell,而-e 3\nngfortran\n[...]显然不是(来源:https://github.com/moby/moby/issues/8949#issuecomment-61682684)。