【发布时间】:2019-05-21 21:51:11
【问题描述】:
我正在尝试将 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
【问题讨论】:
-
您传递给
docker run的-v ${PWD}:/app有效地将主机上的工作目录映射到容器内的app 文件夹。 app 文件夹中的任何内容都将被有效地掩盖。如果您能阐明您试图通过卷映射实现的目标,我可能会建议另一种运行容器的方法。 -
也不确定你在用
-v /app/node_modules做什么。根据文档, -v 选项后跟命名卷的单个值或格式为host-folder:container-folder -
我正在尝试在开发服务器上进行热重载以更接近最终的生产环境。为了使重新加载工作,我想通过 chockaddir 启用轮询。但是现在我什至无法在机器上旋转图像
-
我无法在 Ubuntu 机器(不是 virtualbox)上重现这个。
-v ${PWD}:/app导致主机文件夹挂载到容器内的/app,如果我登录到容器中的外壳并运行ls,我可以看到该文件夹中主机文件夹的内容。-v /app/node_modules的有趣之处在于它创建了一个卷并将其绑定到容器内的/app/node_modules文件夹。在容器上运行docker inspect向我揭示了这一点。您可能想运行相同的程序并查看它显示的内容 -
我没有运行 docker 机器,但我能够确认
-v /app/node_modules很好。正如您所提到的,这样做是为了有效地不从主机文件夹映射 node_modules,而是保留您在构建时安装在映像中的 node_modules。
标签: docker virtualbox mount docker-machine