2017-05-29 99 views
0

我有一個需要容器化的PHP應用程序。我設置了以下內容:我想使用docker-compose volume directive來跨幾個容器共享代碼內容

  1. 容器清漆
  2. 容器nginx的
  3. 爲PHP-FPM容器
  4. 容器的cron
  5. 工裝容器
  6. 容器PHP代碼出爐到

集裝箱2,3,4,5都需要有權訪問相同的PHP應用程序代碼庫被烘焙到容器6中。

我希望通過更改代碼庫容器的版本標記來設置它,以便能夠恢復到應用程序的先前版本。

我現在的作曲家文件是一樣的東西 - >

version "3" 
services: 
    web: 
    image:nginx 
    links: 
    - phpfpm 
    volumes: 
    - code:/var/www/html 

phpfpm: 
    image:php-fpm 
    links: 
    - db 
    volumes: 
    - code:/var/www/html 

code: 
    build: 
    context: ./ 
    dockerfile: Dockerfile 
    volumes: 
    - code:/var/www/html 

volumes: 
    code: 
    driver: local 

此時編碼量已創建。將容器代碼中的PHP代碼副本複製到卷中。

這很好,因爲所有新的更改都會保留到卷中,但是當我拉取新版本的代碼庫時,我的卷將不會更新。

我想實現的是,我的nginx和cron以及工具continer都看到了代碼庫容器的最新版本內容,並且我希望能夠使用該php代碼運行幾個容器調用在容器6中。

我該怎麼做才能去使用v3語法?

感謝

+0

可能的重複:https://stackoverflow.com/q/42958573/596285 – BMitch

+0

嗨,是的,它是或多或少是重複的 – Istvano

回答

0

有幾種方式來處理這個問題:

  1. 大部分工作,但更好的設計是將代碼移植到每個圖像中,可能改變你的架構具有的某些片段只有一個圖像的代碼,而不是每個圖像中的所有部分。共享代碼會產生嚴重的依賴性,這非常違背微服務設計。

  2. 繼續使用指定的卷,但在啓動一個密鑰容器時進行初始化。較不理想(見上文),但會以最小的改變工作。要初始化它,您需要將代碼添加到圖像中的一個目錄中,例如/ var/www/html-cache,將你的卷掛載到/ var/www/html中,入口點的第一步是cp -a /var/www/html-cache/. /var/www/html/.

  3. 創建一個代碼同步映像,可根據您的版本控制按需更新卷。這只是卷位置上的git pull

  4. 使用指向Docker外部代碼的卷,例如,一個主機目錄或甚至一個nfs掛載,它管理Docker外部的代碼同步。這通常用於開發,但我不會推薦它用於生產。

對我而言,docker-compose.yml的版本3現在與swarm模式是同義詞。如果嘗試在羣集模式下執行此操作,則需要在每個可運行容器的主機上運行音量同步,或者指向共享目錄中的外部卷(例如nfs)。沒有升級羣模式,沒有立即需要切換到版本3.

+0

也最好的檢查這個答案出來了。 stackoverflow.com/q/42958573/596285 – Istvano