2016-08-18 160 views
0

我有一個docker-compose dev stack。當我運行,docker-compose up --build,容器將建成,它將執行如何在Docker構建後在主機上的容器內保留更改?

Dockerfile:

RUN composer install --quiet 

該命令會寫一堆文件的./vendor/目錄,它是那麼只有在容器內可用的內部,如預期。主機上現有的vendor/未觸及,因此已過時。

由於我使用發展方面的容器,並希望我的變化可用,我裝在容器內的當前目錄爲卷:

泊塢窗,compose.yml:

my-app: 
    volumes: 
     - ./:/var/www/myapp/ 

此負載一個過期的vendor目錄放入我的容器中;迫使我在主機上或容器內部重新運行composer install以獲得最新版本。

我想知道如何以不同的方式管理我的docker-compose堆棧,以便docker build期間對當前文件夾進行的更改也會保留在主機目錄中,而且我不必兩次運行該命令。

我確實想保留vendor文件夾,因爲有些vendors是我自己的,我喜歡在我當前的項目中修改它們。所以只有安裝我需要運行我的應用程序的文件夾不是最好的解決方案。

我正在尋找一種方法來告訴docker-compose:在添加捲之前,將容器內的所有內容寫回主機。

+0

@ZeRubeus我大部分時間都在做。但有時重建是必要的。然後我想避免重新運行一個命令。 – k0pernikus

回答

2

可以docker-compose build後運行一個短邊的容器:

docker run --rm -v /vendor:/target my-app cp -a vendor/. /target/. 

cp也可能是一些更有效像rsync。然後在該容器退出後,您將執行從主機安裝/供應商的docker-compose up

1

在添加捲之前,將容器內的所有內容寫回主機。

沒有任何方法可以直接做到這一點,但有幾個選項可以作爲第二個命令。

  • 作爲已經建議你可以運行一個容器,複製或rsync的文件
  • 使用docker cp將文件複製從容器中(不使用卷)
  • 使用像dobi(聲明的工具: dobi是我自己的項目)來自動執行這些任務。您可以使用一個圖像來更新vendor,並使用另一個圖像來運行該應用程序。這種方式更新是在主機上完成的,但可以內置到最終圖像中。 dobi負責在工件仍然新鮮時(基於文件或資源的修改時間)跳過不必要的操作,因此您永遠不會執行不必​​要的操作。
+0

Dobi是你自己的項目嗎?如果是這樣,請添加免責聲明。 – k0pernikus

+0

謝謝我會這樣做 – dnephin

相關問題