无法在docker和alpine os中使用echo配置代码,但可以在ubuntu中使用echo配置代码
我有一个Dockerfile,它最初来自ubuntu,最近我遇到了alpine,它更轻,所以我想从中取而代之。我试图构建的部分代码被调用,这取决于。当我最初构建ubuntu版本时,我发现了这个Dockerfile 本质上,问题在于ubuntu中的以下工作,但alpine中没有:无法在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
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