2017-02-14 83 views
1

我是新来的码头和试图移植到它的应用程序。实质上,在启动时,应用程序需要执行一些我已经封装在脚本中的依赖于环境的工作。没有这样的文件或目录在码头建设

我的应用程序看起来像

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 . 

我得到

脚本/ run.sh文件不是一个文件或目录

错误

我不明白为什么我得到这个错误,我想这是来自我天真的误解。我做错了什么,我如何让我的项目工作?

在此先感谢。

回答

3

看来你想要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

我遇到的问题是,我正在编辑窗口,它添加了字符'/ r'到新行。这是SH造成的错误,但不是bash。我花了好几个小时的时间才弄清楚。另一个问题是制表符和空格,当它运行该命令时,它也会关闭shell。

只是想到我会补充说,因为这是我得到的错误的问题。

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

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

+1

感谢您指出这一点。正在遇到类似的问题,需要Docker for Win + WSL环境,而且EOL/r是问题所在。谢谢谢谢! – raupie

相关问题