簡體   English   中英

docker-在主機和容器上編寫持久數據

[英]docker-compose persistent data on host and container

我在docker-compose yml 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

聽起來好像您正在使用主機卷,在其中將主機目錄映射到容器中。 執行此操作時,將看不到映像內該位置的任何內容,只會顯示主機上存在的文件。

如果要從映像內部復制文件以初始化卷,則有兩個選擇:

  1. 切換到命名卷。 Docker會自動將這些初始化為映像的內容,包括所有權限。 如果您不需要從Docker外部直接訪問文件,則這是首選的解決方案。

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

在第二個選項上,如果希望/ data作為應用程序的卷,則可以具有一個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 "$@"

您的映像需要將所有初始文件保存到/ data_save而不是/ data。 然后,如果目錄為空,則將/ data_save復制到卷/ data。 如果根本沒有映射該卷,則僅創建從/ data到/ data_save的符號鏈接。 最后一行從您的Dockerfile運行CMD ,或者docker docker run cli,就像入口點不在一樣。 向您的Dockerfile添加的行如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM