2017-02-21 50 views
0

我正在爲一個運行在Nginx + php-fpm中的簡單Web應用程序的基於Docker的安裝程序工作。我見過的用於存儲實際PHP代碼的常見建議是將其存儲在主機上,然後在Nginx和PHP容器中以只讀方式將其掛載。共享,臨時只讀Docker卷

但是,我希望我的設置是自包含的,因此我可以輕鬆地在帶有Auto Scaling的Amazon ECS上使用它。換句話說,我想以某種方式捆綁代碼,而不是將其從主機中拉出來。

所以看來我想要的是一個可以在兩個Docker容器之間共享的只讀卷,並且在這些容器被銷燬後不會保留。這可能嗎?還是有更好的方法?

回答

1

泊塢窗圖像可以包含預先填充數據的卷。要達到此目的,請在Dockerfile中首先填充目錄(例如,使用COPYRUN),然後將其聲明爲卷。這使您可以構建一個包含體積內的應用程序代碼的圖像:

FROM php:7-fpm 

COPY ./app /var/www/html 
VOLUME /var/www/html 

創建從該圖像的新容器將創建一個新卷,從圖像的/var/www/html目錄中的數據初始化和內部掛載你的新容器在同一個位置。

比較the documentation的詳細資料:

的搬運工運行命令初始化與存在於基本圖像內的指定位置的任何數據新創建的卷。例如,請考慮以下Dockerfile片段:

FROM ubuntu 
RUN mkdir /myvol 
RUN echo "hello world" > /myvol/greeting 
VOLUME /myvol 

這Dockerfile結果導致docker run圖像中,在/myvol創建一個新的安裝點和greeting文件複製到新創建的卷。

這可以讓你簡單地docker run啓動應用程序圖像:

docker run -d --name app my_application_image 

然後你可以運行Nginx的容器,並配置它使用--volumes-from標誌使用相同的體積爲您的應用程序容器:

docker run -d --name web --link app:app --volumes-from app my_nginx_image 

之後,您將擁有一個Docker卷,其中包含您的應用程序代碼,該代碼安裝在兩個容器中,位於/var/www/html

+0

但是,這是否涵蓋了我的問題的「短暫」部分?根據我的理解,這種方法會在我的容器終止後留下孤立的卷,這是我希望避免的。 – phu

+0

容器的容量應該和容器一起刪除,至少在使用['--volumes'或'-v'標誌]時(https://docs.docker.com/engine/reference/commandline/rm/# /選項)。 – helmbert