我正在使用以下命令在容器内运行 docker:
docker run --rm -ti --privileged -v /var/run/docker.sock:/var/run/docker.sock docker:1.12 sh
在该容器的 shell 中,我看到一个包含一堆文件的目录。假设/project
有一个文件build.gradle
。我想启动一个新容器并使用以下命令挂载此目录
docker run -ti --rm -v /project:/project openjdk:8-jdk bash -c "ls /project"
。
然而看起来项目目录是空的,ls /project
没有显示任何文件。
现在尝试挂载一个文件:
docker run -ti --rm -v /project/build.gradle:/project/build.gradle openjdk:8-jdk bash -c "ls /project/"
这次文件夹显示了该文件。
有谁知道为什么卷挂载无法按预期工作。这是权限问题吗?
答案1
不是。在“docker”容器中,您只能获得 Docker 客户端,而不是整个容器。一旦您将 Docker 套接字挂载到“docker”容器中,当您执行 Docker 命令时,它们将直接转到在实际 Docker 主机上运行的 Docker“服务器”。因此,该文件夹应该存在于您的 Docker 主机中。
如何在docker中使用docker挂载卷的示例:
host$ pwd
/var/my-project
host$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v $PWD:/app docker -it sh
/ # ls -l /app ### inside first docker
<LIST OF PROJECT FILES>
/ # docker run -v /var/my-project:/inception docker sh ### you need to pass HOST directory NOT currently running (/app) container directory
/ # ls -l /inception ### inside second docker
<LIST OF PROJECT FILES>
答案2
我在容器内进行开发。要从 docker 启动带有 docker 的应用程序并挂载卷,您只需使用主机中的路径挂载该卷即可。
docker-compose.yaml
:
version: '3.8'
services:
web:
build:
context: ./baseimage
dockerfile: Dockerfile
ports:
- '8000:8000'
volumes:
# - ./<appsrc>:/app # <= This doesn't work
# Instead use the location of the volume on the host system
# (where the docker socket is mounted from)
- /c/Users/<user>/<container_folder>/<appsrc>:/app # <= this does work
现在你可以运行docker-compose up
当然,只有当<container_folder>
您在运行此命令的 docker 容器内安装时,这才有效。