当从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