【问题标题】:No such file or directory in docker builddocker build 中没有这样的文件或目录
【发布时间】:2017-07-02 03:51:57
【问题描述】:

我是 docker 新手,正在尝试将应用程序移植到它。本质上,在启动时,应用程序需要执行一些我已封装在脚本中的环境相关工作。

我的应用看起来像

Dockerfile
scripts/run.sh
build-development/stuff
build-production/stuff

这是我的 Dockerfile:

FROM nginx
RUN chmod +x scripts/run.sh
CMD ["scripts/run.sh", APP_ENV]
EXPOSE 80

这里是scripts/run.sh:

#!/bin/bash

mkdir dist

chmod -R 777 dist

if [ $1 == "development" ]
then
    cp -R build-development/. /usr/share/nginx/html
fi

if [ $1 == "stage" ]
then
    cp -R build-production/. /usr/share/nginx/html
    sed -i 's/production/stage/g' dist/index.html
fi

if [ $1 == "production" ]
then
    cp -R build-production/. /usr/share/nginx/html
fi

我的想法是我会像这样运行图像:

docker run -e APP_ENV=development app-name

它将被输入到脚本中,该脚本将复制正确的文件。

不幸的是,我永远无法运行映像,因为在构建步骤中:

docker build -t app-name .

我收到关于

的错误

scripts/run.sh 不是文件或目录

我不明白为什么我会收到这个错误,我想这是我天真的误解造成的。我做错了什么,我怎样才能让我的项目工作?

提前致谢。

【问题讨论】:

    标签: docker


    【解决方案1】:

    您似乎希望scripts/run.sh 成为容器的一部分。在这种情况下,在您尝试运行 chmod 之前,您需要将其复制到映像中。

    FROM nginx
    COPY scripts/run.sh /scripts/run.sh
    RUN chmod +x /scripts/run.sh
    CMD ["/scripts/run.sh", APP_ENV]
    

    这会将./scripts/run.sh(相对于您的构建目录)复制到/scripts/run.sh 的映像中,因此您以后的RUNCMD 可以使用该路径。

    【讨论】:

      【解决方案2】:

      我遇到的问题是我在 Windows 中进行编辑,这会将字符“/r”添加到新行中。这会导致 SH 出现错误,但不会导致 bash。我花了好几个小时才弄明白。另一个问题是制表符与空格,这也是在运行命令时将 shell 扔掉。

      我只是想补充一下,因为这是我遇到的错误的问题。

      如果您使用的是 notepad++,您实际上可以更改行尾和文本编码。我通常切换到 ANSI 和 unix 行尾以确保 shell 不会抛出错误。

      否则一切正常,只是在 Windows 中编辑时添加了行尾。不知道为什么 shell 无法处理额外的行尾,但这可能是其他人遇到的错误:没有这样的文件。我还必须确保我的 docker 文件将 +x 添加到脚本中,即使它们最初是在 linux 中设置的,因为 Windows 有时会把它们弄乱,所以我必须明确地使用脚本,以确保我或某人否则正在将 dockerfile/files 下载到他们的计算机上,他们不会失去可执行权限。

      【讨论】:

      • 感谢您指出这一点。在 docker-for-win + WSL 环境中遇到了类似的问题,而 EOL /r 就是问题所在。谢谢谢谢!
      • 如果您在 git 存储库中有脚本,并且想要设置 .gitattribute,这是一个有用的答案。 stackoverflow.com/a/2517442/970011
      • @Ashitakalax 谢谢!那是我不知道的。我习惯了我的 IDE 为我做删除,如果他们终于有东西可以为我处理它,我从来没有看过。
      【解决方案3】:

      在某些情况下,当.dockerignore中添加目录或文件时,会导致此问题...

      所以打开或 vi 你的.dockerignore 并确保目录或文件没有添加到那里...

      然后再次运行docker build ...

      【讨论】:

      • 这是我的情况。我花了几个小时来理解为什么。谢谢!
      • 4 年后,您的评论为我节省了数小时的头痛时间。谢谢!
      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 2012-02-26
      • 2020-04-27
      • 2019-01-22
      相关资源
      最近更新 更多