从Dockerfile调用脚本时如何防止`#!/ bin / bash:not found`错误

时间:2017-07-30 22:50:35

标签: bash docker dockerfile

我有以下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
  • 脚本启动并在错误
  • 后继续
  • 构建成功

在dockerhub上构建日志:https://hub.docker.com/r/c33s/debian/builds/bd6g8cqr2rtys9a2gguehcw/(也可以在pastebin https://pastebin.com/6x1UK53H上剪辑构建日志)

2 个答案:

答案 0 :(得分:1)

Bash通常位于不同系统的不同位置。通常在/bin/bash,但在此容器上,它位于此处:

 % docker run -it debian:stretch-backports
root@bb01a3db779e:/# type bash
bash is /usr/bin/bash

env命令更具可预测性,可用于查找shebang行中的其他程序。所以在你的脚本中尝试这个:

#!/usr/bin/env bash

答案 1 :(得分:1)

我现在怀疑问题出在你脚本的内部文件格式中。

通过网络浏览器下载时可能会发生这种情况。至少这是我在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

然后在构建Dockerfile时发生同样的错误。

可以像这样删除BOM,这可以解决问题:

awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' provision-base.sh > provision-base.sh