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

标签 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上)

    最佳答案

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

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

    关于bash - 从Dockerfile调用脚本时如何防止 `#!/bin/bash: not found`错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45405472/

    相关文章:

    mongodb - Spring Boot连接到Mongo容器运行的MongoDB副本集

    java - 使用docker镜像中的sh文件无法执行maven命令

    正则表达式 grep/egrep 问题

    bash - 用唯一标识符替换列表中的重复元素

    git - Jenkins:运行构建不提供 docker slave

    linux - Dockerfile CMD `command not found`

    python - 如何使用scl enable在dockerfile中运行python3应用

    linux - 在 bash 脚本中获取文件夹路径以在 Windows 上工作

    bash - 替换类 bash 和 azuredevops 中的字符串(ios xamarin 管道)

    java - 如何将 JKS 转换为 Docker 注册表证书/ key ?