簡體   English   中英

Docker-compose volumes:持久的,但是在哪里?

[英]Docker-compose volumes: persistant, but where?

我斷斷續續地為此苦苦掙扎了好幾個星期,我不知道自己做錯了什么。 它一定非常簡單,因為我嚴格按照許多教程進行操作,並嘗試了幾乎所有可用的命令。

我嘗試做一些非常基本的事情:創建一個(或多個)具有綁定卷的容器,這樣我就可以在本地編輯我的代碼。 我已經簡化了一個簡單的測試設置:

services:
  nginx:
    container_name: nginx
    image: nginx:stable-alpine
    ports: 
      - "80:80"
    volumes:
      - "./data:/var/www/html"

我嘗試了不同的圖像,通過 Dockerfile 構建了上面的圖像並配置 nginx 以按照您希望的方式運行(從 /var/www/html 提供 php/html),但這沒有任何區別(而且似乎沒有與我的問題直接相關)。

現在,根據我所看到和閱讀的所有內容,這應該在 docker-compose.yml 文件所在的文件夾中創建一個目錄“./data”。 但事實並非如此。 我知道 index.php in./data 在這種情況下不起作用,因為 nginx 尚未配置,但我仍然希望 ./data 的內容在訪問終端中的容器時可用。

當我在容器中使用終端(通過 Docker Desktop)時,我可以瀏覽容器中的文件,但沒有鏈接到我的 local./data 文件夾。 配置 nginx 以提供來自 /var/www/html 目錄的文件按預期工作:瀏覽器窗口顯示文檔根目錄中的任何內容。

現在,真正奇怪的部分是:容器的 /var/www/html 目錄的內容似乎是持久的。 如果我在其中放置一個 index.php,使用 docker-compose down, build, prune, up --build 甚至刪除所有容器、圖像、卷,在我構建和啟動之后手動將文件保留在 /var/www/html 中再次容器。 只有系統重新啟動才能清除這種神秘現象。

據我了解,關閉容器應該清除容器文件系統中所做的所有更改。 從圖像重新安裝或重建應該會重新開始,但事實並非如此。

由於沒有在我期望的位置創建卷(./data 在我的本地開發機器上),但是我放入容器的 /var/www/html 的任何文件在整個過程中似乎都是持久的,我只能想象一些緩存正在發生 - 或者 - 在我不期望的某個地方創建了一個卷(在系統重新啟動后被清除)。

docker cli 和 Docker Desktop 應用程序都沒有顯示任何卷:

$ docker volume ls
DRIVER    VOLUME NAME

檢查 Docker Desktop 中正在運行的容器說(/var/www/test/data 應該是我的本地目錄):

Mounts
/VAR/WWW/HTML     /var/www/test/data

我的問題:

  • 為什么沒有卷目錄./data 創建(或使用,如果我手動創建它)?
  • 為什么 nginx 容器中 /var/www/html 的內容會持久存在(即使在關閉/清除/修剪/重建所有內容之后)?

我到處都看過,但我找錯了地方或使用了錯誤的搜索詞……我找不到其他地方突然出現的這個問題。 可能是我的系統,我的特定設置? 可能是文件系統級別的寫權限嗎?

典型工作流程:

  • 創建 docker-compose.yml 文件
  • 運行 docker-compose build(嘗試跳過這個並運行 docker-compose up --build)
  • 運行 docker-compose up

過程中沒有顯示任何錯誤,nginx 日志告訴我服務器已啟動並運行正常。

系統/版本信息:

$ cat /etc/os-release
NAME="Linux Mint"
VERSION="21 (Vanessa)
$ docker --version
Docker version 20.10.22, build 3a2c30b
$ docker-compose --version
Docker Compose version v2.13.0
$ docker version
Client: Docker Engine - Community
 Cloud integration: v1.0.29
 Version:           20.10.22
 API version:       1.41
 Go version:        go1.18.9
 Git commit:        3a2c30b
 Built:             Thu Dec 15 22:28:04 2022
 OS/Arch:           linux/amd64
 Context:           desktop-linux
 Experimental:      true

Server: Docker Desktop 4.15.0 (93002)
 Engine:
  Version:          20.10.21
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.7
  Git commit:       3056208
  Built:            Tue Oct 25 18:00:19 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.10
  GitCommit:        770bd0108c32f3fb5c73ae1264f7e503fe7b2661
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

幾乎嘗試了一切,包括系統重啟和一遍又一遍地創建場景。 問題依然存在。 我在這里檢查了很多問題和答案,但我最接近這個問題的是人們試圖在圖像中安裝卷......我相信那不是我正在做的......我與 docker-僅 compose.yml(直到我開始工作)。

/var/www/test/data 應該是我的本地目錄

Server: Docker Desktop 4.15.0 (93002)

Docker Desktop 在隱藏的 Linux 虛擬機中運行 Docker。 這在所有平台上都是如此,甚至是原生 Linux。 這意味着容器不一定能訪問整個主機文件系統。

在 Linux 上,使用 Docker Desktop,默認情況下只有主目錄與 Docker VM 共享 這是幾個明顯有效但會產生意想不到的副作用的設置之一:從您的其他描述來看,您似乎正在綁定安裝某些東西(目錄內容正在保留),但它很可能是隱藏的 Linux VM 中的一個目錄.

我在這里建議三個主要選項:

  1. 將您的項目移動到您的主目錄; 這是您在其他答案中已經完成的。
  2. 在Docker Desktop“設置”頁面的“文件共享”選項卡下添加宿主機的/var/www目錄。
  3. 不要在原生 Linux 上使用 Docker Desktop。 卸載它並改用獨立的 Docker 引擎。 (如果您已經安裝了它,您可能需要運行docker context use default 。)

@Garuno 你對目錄有所了解。 我已將 docker-compose.yml 復制到我的 ~/Projects 文件夾中的一個新目錄,它現在按預期工作..,本地目錄被保留。 並在重建/重新啟動后安裝...耶!

作品:

:~/Projects/test3$ ls -al
total 16
drwxrwxr-x 3 jeroen jeroen 4096 Dec 20 14:29 .
drwxr-xr-x 3 jeroen jeroen 4096 Dec 20 14:28 ..
drwxr-xr-x 2 jeroen jeroen 4096 Dec 20 14:30 data
-rw-rw-r-- 1 jeroen jeroen  111 Dec 20 14:28 docker-compose.yml

不起作用:

:/var/www/test2$ ls -al
total 12
drwxr-xr-x 2 jeroen jeroen 4096 Dec 20 14:27 .
drwxr-xr-x 9 jeroen jeroen 4096 Dec 20 11:22 ..
-rw-r--r-- 1 jeroen jeroen  110 Dec 20 14:15 docker-compose.yml

明顯的區別在於當前目錄和 docker-compose.yml 文件的某些組權限,但即使我 chmod /var/www/test2 與項目目錄完全相同,綁定卷也不起作用。

但是,它確實在/home/jeroen/Projects/test3 ... 中創建了數據目錄,並在本地或通過容器命令行中的終端顯示了應有的文件。

我很困惑這將如何工作,或者出了什么問題,但我的/var/www目錄似乎無法工作。 現在,我很高興我讓它以某種方式工作。

如果您有任何信息可以進一步說明這一點,請將其作為答案發布,我很樂意將其標記為可能面臨同樣謎團的其他人的解決方案。

暫無
暫無

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

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