簡體   English   中英

Docker - 安裝不像常規安裝的卷

[英]Docker — mounting a volume not behaving like regular mount

我是docker新手所以我確信我做錯了什么。 not a php developer但在這種情況下這應該不重要。

我正在使用drupal docker鏡像,它在/var/www/html目錄中有數據。

我試圖從主機系統上的本地目錄中使用drupal站點覆蓋此數據。

根據文檔,這是預期的行為

將主機目錄掛載為數據卷

除了使用-v標志創建卷之外,您還可以將Docker引擎主機中的目錄安裝到容器中。

$ docker run -d -P --name web -v / src / webapp:/ webapp training / webapp python app.py

此命令將主機目錄/ src / webapp安裝到/ webapp的容器中。 如果路徑/ webapp已經存在於容器的映像中,則/ src / webapp掛載覆蓋但不會刪除預先存在的內容。 刪除安裝后,可以再次訪問該內容。 這與mount命令的預期行為一致。

但是我發現容器上不存在本地drupal站點文件。 我的完整工作流程如下:

docker-compose.yml
drupal:
  container_name: empower_drupal
  build: ./build/drupal-local-codebase
  ports:
   - "8888:80"
   - "8022:22"
   - "443"
 #volumes: THIS IS ALSO NOT WORKING
 #- /home/sameh/empower-tap:/var/www/html


$ docker-compose up -d
# edit the container by snapshotting it
$ docker commit empower_drupal empower_drupal1
$ docker run -d -P --name empower_drupal2 -v /home/sameh/empower-tap:/var/ww/html empower_drupal1
# snapshot the container to examine it
$ docker commit 9cfeca48efd3 empower_drupal2
$ docker run -t -i empower_drupal2 /bin/bash

empower_drupal2容器沒有來自/home/sameh/empower-tap目錄的正確文件。

為什么這不起作用

這是你做的,帶有一些注釋。

$ docker-compose up -d

鑒於你的搬運工,compose.yml,與volumes注釋掉,在這一點上,你已經運行的容器部分,但沒有安裝卷。

# edit the container by snapshotting it
$ docker commit empower_drupal empower_drupal1

你在這里所做的一切都是你已經擁有的圖像的副本,除非你的容器在啟動時對自己做了改動。

$ docker run -d -P --name empower_drupal2 -v /home/sameh/empower-tap:/var/ww/html empower_drupal1

在這里,您已運行新副本,已安裝卷。 好的,這個文件現在可以在這個容器中使用了。

# snapshot the container to examine it
$ docker commit 9cfeca48efd3 empower_drupal2

我在這里假設你想將卷的內容提交到圖像中。 那不管用。 提交文檔清楚地說明了這一點:

提交操作將不包括容器內安裝的卷中包含的任何數據。

$ docker run -t -i empower_drupal2 /bin/bash

因此,正如您所發現的,當您運行commit生成的圖像但沒有卷安裝時,文件就不存在了。

此外,您的docker-compose.yml示例中還不清楚volume volumes: section是否在注釋掉之前。 目前它似乎在左邊緣,這是行不通的。 它需要與build:ports:處於同一級別ports:為了處理你的drupal服務。

該怎么做

這取決於你的目標。

只需從本地復制文件

如果您只是想用本地系統中的文件填充圖像,可以在Dockerfile中執行此操作。

COPY local-dir/* /var/www/html

您提到此副本無法工作,因為該目錄不是本地的。 不幸的是,用symlink這樣的東西很難解決。 您最好的選擇是在構建之前將目錄復制到本地上下文。 Docker 不打算改變這種行為

覆蓋內容以進行開發

一種常見的情況是您希望使用本地目錄進行開發,以便立即反映更改而不是進行重建。 但是當不進行開發時,您希望將文件烘焙到圖像中。

在這種情況下,首先告訴Dockerfile將文件復制到圖像中,如上所述。 這樣,圖像構建將包含它們,卷裝載或否。

然后,在進行開發時,使用volumes:在docker-compose.yml中,或者使用-v標志到docker run,以安裝卷。 卷裝置將覆蓋圖像中的任何內容,因此您將使用本地文件。 當您完成並且代碼已准備就緒時,只需執行映像構建,您的最終文件將被烘焙到映像中以進行部署。

使用卷加提交

您也可以通過安裝卷,將內容復制到其他地方,然后提交結果,以略微迂回的方式執行此操作。

# start a container with the volume mounted somewhere
docker run -d -v /home/sameh/empower-tap:/var/www/html_temp [...etc...]

# copy the files elsewhere inside the container
docker exec <container-name> cp -r /var/www/html_temp /var/www/html

# commit the result
docker commit empower_drupal empower_drupal1

然后,您應該在生成的圖像中包含已安裝的卷文件。

暫無
暫無

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

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