docker - 无法从 ubuntu 18.04 主机将卷挂载到 docker-machine
问题描述
我正在尝试将 Ubuntu 18.04 主机上的 React 应用程序 Dockerize 到节点 12 来宾。我正在遵循本指南https://mherman.org/blog/dockerizing-a-react-app/一切正常,直到我将卷安装到 docker-machine。安装卷后,来宾上的目标文件夹为空,甚至删除已安装在映像中的现有文件。
以下是我的 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-machine 并配置 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-machine 之外运行 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-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 run 时为空。在执行 docker run 之前将目录挂载到 VM 中的所需位置可以正确挂载。
推荐阅读
- wpf - 如何从基类和派生类更改 WPF DataGrid 中显示的属性的数据顺序?
- java - 排序矩阵中的二分搜索
- sql - 如何使 max() 函数只输出一行
- java - 如何从其父元素(h3)中删除所有子元素(span)?
- python - 使用 OpenCV 时无法将图像转换为灰度
- algorithm - 定义仅针对 2D 平面上特定形状内的点触发的神经网络的权重和阈值
- c - 如何在 Swift 中处理 c 枚举回调函数
- mysql - MySQL 索引大小
- javascript - 尝试使用 Cypress.io 登录,但收到 CORS 错误“来源不匹配”
- javascript - 如何在 Nuxt.js 上设置未知的 baseUrl?