无法从 ubuntu 18.04 主机将卷装载到 docker-机器

Unable to mount volumes to docker-machine from ubuntu 18.04 host

我正在尝试将 Ubuntu 18.04 主机上的 React 应用程序 Dockerize 到节点 12 来宾。我正在按照本指南 https://mherman.org/blog/dockerizing-a-react-app/ 进行操作,并且在我将卷安装到 docker 机器之前一切正常。安装卷后,来宾上的目标文件夹为空,甚至删除了已安装在映像中的现有文件。

以下是我的 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 # 

但是在安装卷之后目标文件夹只包含 node_modules

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 机器之外执行 运行 命令,应用程序将正常启动。所以我怀疑 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-machine 后,我可以验证自动挂载共享文件夹是否正常工作,因为它们存在于 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运行时此文件夹为空。在执行 docker 运行 之前将目录安装到 VM 中所需的位置可以正确安装。