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

时间:2017-02-14 01:18:18

标签: 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

这里是脚本/ 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 个答案:

答案 0 :(得分:5)

您似乎希望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可以使用该路径。

答案 1 :(得分:4)

我遇到的问题是,我在Windows中编辑,它将字符'/ r'添加到新行。这导致了SH的错误而不是bash。我花了好几个小时来解决这个问题。另一个问题是制表符与空格,这也是在运行命令时抛出shell。

我想补充一点,因为那是我遇到的错误的问题。

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

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

答案 2 :(得分:2)

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

因此打开或vi .dockerignore,并确保未在其中添加目录或文件...

然后再次运行docker build .

.dockerignore

相关问题