我有以下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上剪辑构建日志)
答案 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