在docker构建中出现“没有此文件或目录”的错误

5

我是一名 Docker 初学者,正在试图将一个应用程序迁移到 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 不是文件或目录”的错误信息。我不理解为什么会出现这个错误,我猜测这是由于我的一些天真的误解所导致的。请问我做错了什么,如何使我的项目正常运行?
谢谢您提前的帮助。
3个回答

8

看起来您希望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 命令可以使用该路径。


7
我遇到的问题是在Windows上编辑时,会在新行添加字符“/r”。这导致SH出现错误,但bash没有。我花了几个小时才找到问题所在。另一个问题是制表符与空格之间的差异,在运行命令时也会影响Shell。
如果您使用Notepad ++,实际上可以更改行结尾和文本编码。我通常切换到ANSI和Unix行结尾以确保Shell不会抛出错误。
否则一切都正常,只是在Windows中编辑时会添加行结尾。不知道为什么Shell无法处理额外的行结尾,但这可能是其他人遇到“无此文件”错误时的原因。我还必须确保我的Docker文件即使最初在Linux中设置了脚本也要添加+x,因为有时Windows会搞砸它们,所以我必须明确指定脚本,以确保我或其他人将Dockerfile /文件下载到他们的计算机上时不会丢失可执行权限。

2
感谢您指出这一点。我在使用docker-for-win + WSL环境时遇到了类似的问题,EOL / r是问题所在。非常感谢! - raupie
1
如果您的脚本在git存储库中,并且想要设置.gitattribute,以下是一个有用的答案。 https://dev59.com/B3E85IYBdhLWcg3w_Ixr#2517442 - Ashitakalax
@Ashitakalax 谢谢!这是我不知道的东西。我已经习惯了我的IDE为我删除它,从来没有查过它们最终是否有处理它的东西。 - Caperneoignis

5
在某些情况下,当在 .dockerignore 中添加目录或文件时,会引起这个问题...
因此,请打开或使用vi编辑你的 .dockerignore 并确保未将该目录或文件添加到其中...
然后再次运行 docker build .

.dockerignore


1
这是我的情况。我花了几个小时去理解原因。谢谢! - Tung
1
四年后,你的评论为我节省了数小时的头痛。谢谢! - CodeCaffeinateContinue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接