在docker build中没有这样的文件或目录

pQu*_*123 3 docker

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

我的应用看起来像

Dockerfile
scripts/run.sh
build-development/stuff
build-production/stuff
Run Code Online (Sandbox Code Playgroud)

这是我的Dockerfile:

FROM nginx
RUN chmod +x scripts/run.sh
CMD ["scripts/run.sh", APP_ENV]
EXPOSE 80
Run Code Online (Sandbox Code Playgroud)

这是脚本/ 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
Run Code Online (Sandbox Code Playgroud)

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

docker run -e APP_ENV=development app-name
Run Code Online (Sandbox Code Playgroud)

并将其输入脚本中,该脚本将复制正确的文件。

不幸的是,我从未运行过该映像,因为在构建步骤中:

docker build -t app-name .
Run Code Online (Sandbox Code Playgroud)

我收到有关的错误

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

我不明白为什么会收到此错误,我想这是我天真的误解造成的。我在做错什么,如何使我的项目正常进行?

提前致谢。

Dan*_*owe 6

似乎您想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]
Run Code Online (Sandbox Code Playgroud)

这将复制./scripts/run.sh(相对于您的构建目录)成图像/scripts/run.sh,所以你后来RUNCMD有可用的路径。


Cap*_*nis 5

我遇到的问题是我正在Windows中进行编辑,这会将字符'/ r'添加到新行中。这会导致SH错误,但不会导致bash错误。我花了好几个小时才弄清楚。另一个问题是制表符和空格,这在运行命令时也把外壳扔掉了。

只是想出我要补充的内容,因为那是我得到的错误的问题。

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

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

  • 感谢您指出了这一点。docker-for-win + WSL环境遇到了类似的问题,而EOL / r就是问题。谢谢谢谢! (2认同)

Ali*_*eza 5

在某些情况下,当目录或文件被添加进来时.dockerignore,会导致这个问题......

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

docker build .再次运行..

.dockerignore