我可能只是在这里愚蠢,但我认为这不应该工作,但它确实如此,我不明白为什么。在构建期间,我将测试文件复制到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 Ubuntu20.04上运行Docker Destop3.6.0
发布于 2021-10-21 10:36:00
第一次(仅)将名为volume (仅限)的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将文件复制到卷中“的行为。有几个使用它的常见模式,但当卷从未更新或设置不能在不同的容器运行时运行时,它们会感到惊讶。
发布于 2021-10-21 10:11:41
Docker卷独立于您的镜像/容器存在。如果运行docker volume ls,您将看到您的卷,这是数据所在的位置,并在运行时挂载到容器中
https://stackoverflow.com/questions/69659562
复制相似问题