2017-06-15 241 views
0

持久化數據我有在泊塢窗,撰寫陽明海運量的問題3.0+搬運工,撰寫主機和容器

所以我知道,一個卷的行爲與安裝。但我已成立了一個wiki和時我在docker-compose中設置了一個卷,容器上的數據將被刪除(隱藏)

那麼如何將我的容器中的數據首先保存到我的主機中,而下一次啓動容器時,它只會覆蓋我保存的數據。

所以目前的情況是: 我以「docker-compose up --build」開頭,並創建一個卷(空)並將其複製到容器中。容器上該文件夾中的所有內容都將被刪除結果

泊塢窗,compose.yml

version: '3.1' 

services: 

    doku-wiki: 
    build: . 
    ports: 
     - '4000:80' 

Dockerfile

FROM php:7.1-apache 
COPY dokuwiki-stable /var/www/html/ 
COPY entrypoint.sh /entrypoint.sh 
RUN chmod 777 /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 
EXPOSE 80 
+0

您能澄清一下問題嗎?您是否正在尋找一種「在容器啓動時將現有容器數據複製到捲上」的方法? –

+0

是的,我第一次通過碼頭啓動容器 - 編寫它應該將現有的容器數據複製到一個卷。之後,容器應該使用卷中的日期而不會覆蓋所有內容。 例如,我想要備份文件夾「/ data/pages /」 但是在第一次啓動時,備份卷將爲空白,並且它不會將任何內容複製到/ data/pages /,但會刪除現有內容容器 – Bvz

+0

我在docker-compose.yml文件中看不到任何卷定義。數量在哪裏起作用? – programmerq

回答

1

這聽起來像你正在使用一臺主機的體積,你映射主機目錄放入容器中。當你這樣做時,你的圖像中該位置的任何內容都將不可見,只有主機上存在的文件纔可見。

如果你想擁有的文件的副本,從圖像中初始化體積內,你有兩個選擇:

  1. 切換到指定的體積。 Docker會自動初始化這些到圖像的內容,包括任何權限。如果您不需要直接訪問Docker以外的文件,則這是首選解決方案。

  2. 更改圖像入口點以及在圖像中存儲文件的位置。

在第二個選項,如果你想/數據,以對您的應用程序數量,你可以有,做一個entrypoint.sh:

#!/bin/sh 

if [ ! -d "/data" ]; then 
    ln -s /data_save /data 
elif [ -z "$(ls -A /data)" ]; then 
    cp -a /data_save/. /data/ 
fi 
exec "[email protected]" 

你的圖像需要保存所有初始文件到/ data_save而不是/ data。然後,如果目錄是空的,它會爲你的卷/數據做一個/ data_save的拷貝。如果卷根本沒有映射,那麼它只是創建從/ data到/ data_save的符號鏈接。最後一行從您的Dockerfile或docker run cli運行CMD,就好像入口點沒有在那裏一樣。添加到您的Dockerfile中的行如下所示:

COPY entrypoint.sh /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 
+0

非常感謝您的幫助。我試過了入口點。sh腳本,但當我用docker-compose啓動容器時出現以下錯誤 「doku-wiki_1 | standard_init_linux.go:178:exec用戶進程導致」沒有這樣的文件或目錄「」 – Bvz

+0

我是否需要任何卷解? – Bvz

+0

「沒有這樣的文件或目錄」意味着文件沒有被複制到圖像中,或者第一行指向容器上不存在的東西('/ bin/sh')。我也在腳本中用windows換行符看過。第二種解決方案適用於您當前的主機卷。 – BMitch