我可能只是在這里很愚蠢,但我認為這不應該起作用,但它確實起作用了,我不明白為什么。我在構建期間將測驗檔案處理到我的 Docker 映像中的 /var/www,然后在 /var/www 上安裝命名卷,但我仍然看到這些檔案。
~/test$ tree
.
├── docker
│ ├── data
│ │ └── Dockerfile
│ └── docker-compose.yml
└── src
├── testfile1
└── testfile2
3 directories, 4 files
./docker/docker-compose.yml
version: '3'
services:
test-data:
container_name: test-data
build:
context: ..
dockerfile: ./docker/data/Dockerfile
volumes:
- test-data:/var/www
volumes:
test-data:
name: test-data
./docker/data/Dockerfile
FROM alpine
COPY src/ /var/www/
CMD sleep infinity
據我所知,在構建時卷不可用,并且應該覆寫/隱藏檔案,因為它在容器啟動時也安裝在 /var/www 上,但它沒有?
~/test$ docker inspect -f '{{ .Mounts }}' test-data
[{volume test-data /var/lib/docker/volumes/test-data/_data /var/www local rw true }]
~/test$ docker exec test-data ls -l /var/www
-rw-r--r-- 1 root root 0 Oct 21 09:01 testfile1
-rw-r--r-- 1 root root 0 Oct 21 09:01 testfile2
在 Windows WSL2 Ubuntu 20.04 上運行 Docker Destop 3.6.0
uj5u.com熱心網友回復:
Docker 卷獨立于您的映像/容器而存在。如果您運行,docker volume ls您將看到您的卷,這是資料所在的位置,并在運行時掛載到容器
uj5u.com熱心網友回復:
第一次(僅)Docker 命名卷(僅)附加到容器時,Docker 會將檔案從底層映像復制到卷中。在此初始副本之后,卷內容永遠不會更新。對于主機目錄系結掛載、Kubernetes 或其他非實際 Docker 環境,此副本也不會發生。
您會以兩種方式看到您期望的行為。首先,如果您將其更改volumes:為系結安裝
volumes:
- ./local-empty-directory:/var/www
您會看到按照您期望的方式替換影像內容。您可以更改的另一件事是運行現有設定一次,更改影像的內容,然后再次運行
docker-compose build
docker-compose run --rm test-data ls -l /var/www
touch src/testfile3
docker-compose build
docker-compose run --rm test-data ls -l /var/www
# testfile3 isn't in the volume and won't be in this listing
由于其局限性,我傾向于不建議實際依賴“Docker 將檔案復制到卷”行為。有幾個使用它的常見模式,但是當卷從未更新或設定沒有在不同的容器運行時中運行時,會感到驚訝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/331731.html
標籤:码头工人
