当从Dockerfile调用脚本时,如何防止出现`#!/ bin / bash:not found`错误
我有以下的Dockerfile
:
FROM debian:stretch-backports MAINTAINER c33s ARG DEBIAN_FRONTEND=noninteractive COPY provision-base.sh /root/provision-base.sh RUN chmod +x /root/provision-base.sh && /root/provision-base.sh
为什么我得到以下错误运行它:
...snip... /root/provision-base.sh: 1: /root/provision-base.sh: #!/bin/bash: not found ...snip...
- 该文件存在
RUN ls /root/provision-base.sh
显示它 -
RUN which bash
也显示bash被安装 - 该脚本开始并在错误之后继续
- 构build成功
在dockerhub上build立日志: https ://hub.docker.com/r/c33s/debian/builds/bd6g8cqr2rtys9a2gguehcw/(构build日志的片段也在pastebin https://pastebin.com/6x1UK53H上 )
我现在怀疑问题是在脚本的内部文件格式。
通过网页浏览器下载时可能会发生这种情况。 至less这是我在Mac OS上通过Chrome浏览器下载/debian/provision-base.sh
后得到的:
$ file * provision-base.sh: Bourne-Again shell script text executable, UTF-8 Unicode (with BOM) text script-with-good-format.sh: Bourne-Again shell script text executable, ASCII
然后在构buildDockerfile时出现同样的错误。
BOM
可以像这样被移除,这应该可以解决问题:
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' provision-base.sh > provision-base.sh
Bash经常在不同的系统上不同的地方。 经常在/bin/bash
,但在这个容器上它位于:
% docker run -it debian:stretch-backports root@bb01a3db779e:/# type bash bash is /usr/bin/bash
env
命令更具可预测性,可用于在shebang行中查找其他程序。 所以在你的脚本中试试这个:
#!/usr/bin/env bash