2017-02-14 80 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

相關問題