无法在docker和alpine os中使用echo配置代码,但可以在ubuntu中使用echo配置代码

无法在docker和alpine os中使用echo配置代码,但可以在ubuntu中使用echo配置代码,docker,ubuntu,alpine,Docker,Ubuntu,Alpine,我有一个Dockerfile,它最初来自ubuntu,最近我遇到了alpine,它更轻,所以我想从中取而代之。我试图构建的部分代码被调用,这取决于。当我最初构建ubuntu版本时,我发现了这个Dockerfile 本质上,问题在于ubuntu中的以下工作,但alpine中没有: RUN echo "3\ngfortran\n\nY\n\n\ngcc\n\n\n\n\nN\n1\nY\nN\nN\n0\n" | ./configure && make 我得到的错误是 So

我有一个Dockerfile,它最初来自ubuntu,最近我遇到了alpine,它更轻,所以我想从中取而代之。我试图构建的部分代码被调用,这取决于。当我最初构建ubuntu版本时,我发现了这个Dockerfile

本质上,问题在于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行长。我尝试过安装bash并将脚本更改为该脚本,但没有成功

ubuntu Dockerfile 阿尔卑斯码头 TL;博士 在您的
Dockerfile
中,使用:

RUN /bin/echo -e "3\ngfortran\n[...]" | ./configure && make
在Ubuntu和Alpine上有相同的行为

解释 使用
/bin/sh
执行
/configure
脚本(请参见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
)上,
\n
用于分隔两个参数

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

docker run --rm -v $PWD/configure:/configure alpine:3.8 /bin/sh -c 'echo "a                   
b                                                 
" | ./configure'
或:

(参见
echo
-e
参数)

这两个命令用于打印:

a-b

对于您的
Dockerfile
,您应该编写如下内容:

RUN /bin/echo -e "3\ngfortran\n[...]" | ./configure && make
使用
/bin/echo
代替
echo
,因为在Ubuntu上,
echo-e“3\ngfortran\n[…]”
将打印
-e3\nngfortran\n[…]

这是因为
echo
是通过内置shell解析的,而
/bin/echo
不是显式解析的(源代码:)


您是否检查了
/configure
脚本第162行(错误来自何处)?你能编辑你的问题并发布这个脚本(至少是返回错误的部分)吗?@norbjd已经编辑了这个问题我认为这里的主要问题是你向
/configure
脚本传递参数的方式。您应该使用该答案中给出的解决方案之一:it’。我会尝试但只是好奇为什么它在ubuntu/macos上工作,就像我在上面看到的一样,^我看到的唯一区别是所使用的shell:执行脚本(请参见
/configure
顶部的shebang),alpine使用
/bin/sh
->
/bin/busybox
,ubuntu使用
/bin/sh
->
/bin/dash
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'
RUN /bin/echo -e "3\ngfortran\n[...]" | ./configure && make