[英]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
我的問題:
我到處都看過,但我找錯了地方或使用了錯誤的搜索詞……我找不到其他地方突然出現的這個問題。 可能是我的系統,我的特定設置? 可能是文件系統級別的寫權限嗎?
典型工作流程:
過程中沒有顯示任何錯誤,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 中的一個目錄.
我在這里建議三個主要選項:
@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.