无法从ubuntu 18.04主机将卷装载到docker计算机

无法从ubuntu 18.04主机将卷装载到docker计算机,docker,virtualbox,mount,docker-machine,Docker,Virtualbox,Mount,Docker Machine,我正在尝试将Ubuntu18.04主机上的React应用程序停靠到节点12来宾。我遵循这个指南,在我开始将卷装入docker机器之前,一切正常。装入卷后,guest上的目标文件夹为空,甚至会删除映像中已装入的现有文件 以下是我的Dockerfile: # base image FROM node:12.2.0-alpine RUN apk add --no-cache git # set working directory WORKDIR /app # add `/app/node_modu

我正在尝试将Ubuntu18.04主机上的React应用程序停靠到节点12来宾。我遵循这个指南,在我开始将卷装入docker机器之前,一切正常。装入卷后,guest上的目标文件夹为空,甚至会删除映像中已装入的现有文件

以下是我的Dockerfile:

# base image
FROM node:12.2.0-alpine
RUN apk add --no-cache git

# set working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install and cache app dependencies
COPY ./package.json /app/package.json
RUN npm install --silent
RUN npm install react-scripts@3.0.1 -g --silent

# start app
CMD ["npm", "start"]
创建docker计算机并将shell配置为连接到该计算机:

docker-machine create -d virtualbox lz-front
eval $(docker-machine env lz-front)
装载项目根文件夹

sanka@ThinkPad-P1:~/code/lz/lz-new$ VBoxManage sharedfolder add lz-front --name lz-new --hostpath /home/sanka/code/lz/lz-new/ --automount
树立形象

sanka@ThinkPad-P1:~/code/lz/lz-new$ docker build -t lz:dev .
检查内部显示的一切与预期一致:

sanka@ThinkPad-P1:~/code/lz/lz-new$ docker run -it --rm lz:dev sh
/app # ls
node_modules       package-lock.json  package.json
/app # 
但在装入卷之后,目标文件夹只包含节点_模块

sanka@ThinkPad-P1:~/code/lz/lz-new$ docker run -v ${PWD}:/app -v /app/node_modules -p 3001:3000 -it --rm lz:dev sh
/app # ls
node_modules
/app # 
如果我在docker机器之外运行run命令,应用程序将正常启动。所以我怀疑VirtualBox自动安装对我不起作用

编辑: 这将显示工作目录的内容

sanka@ThinkPad-P1:~/code/lz/lz-new$ ls
config-overrides.js  Dockerfile    package.json  README.md  test
docker-compose.yml   node_modules  public        src
编辑2: 在使用ssh登录docker机器后,我可以验证自动装载共享文件夹的工作方式,因为它们存在于VM中

sanka@ThinkPad-P1:~/code/lz/lz-new$ docker-machine ssh lz-front
docker@lz-front:~$ ls /
bin       home      lib       lz-new    proc      sbin      usr
dev       hosthome  lib64     mnt       root      sys       var
etc       init      linuxrc   opt       run       tmp

将VBoxManage命令更改为:

sanka@ThinkPad-P1:~/code/lz/lz-new$ VBoxManage sharedfolder add lz-front --name ${PWD} --hostpath ${PWD} --automount

解决了这个问题。我的最佳猜测是,卷是从VM用户文件夹装入的,而不是直接从主机文件夹装入的。执行docker run时,此文件夹为空。在执行docker run之前,将目录装载到VM中所需的位置可以实现正确装载。

您要传递到
docker run
-v${PWD}:/app
有效地将主机上的工作目录映射到容器内的app文件夹。应用程序文件夹中的任何内容都将被此屏蔽。如果您可以澄清您试图通过卷映射实现什么,我可能可以建议运行容器的另一种方法。也不确定您使用
-v/app/node_模块做什么。根据文档,-v选项后面是命名卷的单个值,或者是
host folder:container folder
格式的值,我正在尝试在development server上进行热重新加载,以便更接近最终的生产环境。为了使重新加载工作正常,我想通过Chockadir启用轮询。但是现在我甚至无法在机器上旋转图像,我无法在Ubuntu机器(不是virtualbox)上复制图像。
-v${PWD}:/app
会将主机文件夹装入容器中的
/app
,如果我登录到容器中的shell并运行
ls
,我可以看到该文件夹中主机文件夹的内容。
-v/app/node_modules
的有趣之处在于它创建了一个卷并将其绑定到容器内的
/app/node_modules
文件夹。在集装箱上运行
docker inspect
,我发现了这一点。您可能想运行相同的程序,看看它显示了什么。我没有运行docker机器,但我能够确认
-v/app/node_modules
是否正常。正如您提到的,这样做是为了有效地不从主机文件夹映射节点_模块,而是将您在构建时安装的节点_模块保留在映像中。