2016-08-11 131 views
0

我想爲nodejs-bower-grunt構建一個容器,但保持我的源代碼與git存儲庫同步(本例中爲Bitbucket)。這個想法是爲我的團隊提供一個容器,以便每個開發人員不需要在他們的環境中安裝這些包。與其安裝nodejs,bower和grunt來運行應用程序的前端,他們只是使用容器來管理它們並專注於源代碼。所以這是我DockerFile:如何爲同步的源代碼構建一個Docker容器?

FROM ubuntu:14.04 

RUN  apt-get update 
RUN  apt-get install -y nodejs npm git git-core 
RUN  ln -s /usr/bin/nodejs /usr/bin/node 

WORKDIR /app 

ADD package.json /app/ 
ADD bower.json .bowerrc* /app/ 

RUN  npm install -g bower 
RUN  npm install -g grunt-cli 
RUN  npm install 
RUN  bower install --allow-root 

CMD ["grunt", "serve"] 

EXPOSE 9000 
EXPOSE 35729  

所以我建立容器中,然後運行使用此代碼:

docker run -ti -p 9000:9000 -p 35729:35729 -d -v /home/MY_USER/Projects/app:/app --name app --net=host my_repository/app 

期待音量參數將注入的源代碼放到/應用程序文件夾中的容器沒有替換之前在DockerFile中配置的所有東西。據official documentation,內容應該保留: 「/src/webapp掛載覆蓋,但不刪除已有的內容」,但事實證明,當我檢查正在運行的容器時,掛載的內容由DockerFile替換爲由參數傳遞的-v文件夾內容。一種解決方案是將所有的應用程序內容複製到容器本身,然後運行容器,但這個解決方案對於開發項目來說是不切實際的,因爲應用程序中的每個更新都需要構建另一個容器。所以,我的問題是:我如何構建這個容器,以便主機源代碼中的每個更新都能反映正在運行的容器?

+2

文檔說明:掛載覆蓋但不刪除已存在的內容。一旦掛載被刪除,內容可以再次訪問。第二部分也很重要。您的預先存在的內容在安裝過程中無法訪問。我不知道它是否可能(不知道應用程序),但解決方案可能是更改您的文件夾/應用程序結構。 E.G一個文件夾項目,其中包含你的package.json和bower.json ADD)+項目文件夾內的一個應用程序文件夾,用於安裝應用程序。但不知道你的情況是否可能。 – lvthillo

+0

它已經是這樣了。文件package.json和bower.json位於應用程序的根文件夾中,並且根中的應用程序文件夾也包含所有其他應用程序文件。 – Digao

+0

這對我來說不是很清楚。因此,package.json和bower.json位於/ app中,而您的應用程序實際上位於/ app/app/*中,或者您的意思是?當你的應用程序也在/ app中時,它會覆蓋你的package.json和bower.json – lvthillo

回答

0

我認爲你將不得不從主當前圖像的存儲庫中單獨將容器的更改拉出。或者,您可以使用rsync之類的軟件來同步本地Docker容器之間的實時文件更改,然後將其推送到源代碼。

+0

我還想看看其他開發人員如何以可行的方式處理這些問題... – Digao

+0

好的,我認爲我誤解了你的問題或者沒有透徹理解它 – nagrom97

2

我找到了一個解決方案,基於this後。運行容器正確的方法應該是這樣的:

docker run -ti -p 9000:9000 -p 35729:35729 -d -v /home/MY_USER/Projects/app/app:/app/app --name app --net=host my_repository/app 

這個命令告訴泊塢窗初始化容器,並僅在應用程序的子文件夾,而不是應用程序的整個根部結構,這種方式使所有裝入卷在構建過程中進行的一系列配置。