基于:
https://shekhargulati.com/2019/01/18/dockerizing-a-vue-js-application/
我正在尝试运行一个支持热重装的容器。根据以上指南,运行docker run命令应该可以实现:
docker run -it -p 8081:8080 -v ${PWD}:/app/ -v /app/node_modules --name CONTAINER_NAME FRONTEND_IMAGE
但是我不理解这一部分:-v ${PWD}:/app/ -v /app/node_modules
。看第一部分:
-v ${PWD}:/app/
根据文档:
https://docs.docker.com/storage/bind-mounts/
-v
的第一个参数是卷的名称。为什么要选择名称${PWD}
作为名称?就我而言,最终是:/home/user/code/sample001
在第二种情况下:
-v /app/node_modules
该卷甚至没有名称。与docker docs中的示例进行比较:
$ docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
我不知道-v /app/node_modules
怎么有意义。
如果我那么做:
$ docker inspect CONTAINER_NAME
...
"HostConfig": {
"Binds": [
"/home/user/code/sample001:/app/"
],
...
"Mounts": [
{
"Type": "bind",
"Source": "/home/user/code/sample001",
"Destination": "/app",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "volume",
"Name": "83cbd979484473e3a5a258b8dbad052bc8927e207aa2dc4afa73be72113d3102",
"Source": "/var/lib/docker/volumes/83cbd979484473e3a5a258b8dbad052bc8927e207aa2dc4afa73be72113d3102/_data",
"Destination": "/app/node_modules",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
-v ${PWD}:/app/
实际上创建一个绑定而不是一个卷。
我想念什么?
答案 0 :(得分:2)
共有三种类型的卷:主机卷,匿名卷和命名卷。参见Different Types of Volumes
/app/node_modules
是一个匿名卷,由Docker直接处理。
如文章所述:
第二个-v标志确保主机node_modules不被覆盖 容器的node_modules。为了确保这一点,我们创建了一个数据 / usr / src / app / node_modules的卷。如果要运行docker run 没有第二个-v标志的命令,那么您将得到错误 vue-cli-service:找不到。
构建的映像包含node_modules
中的app/node_modules
。如果在容器初始化期间未指定匿名卷,则整个app
目录将被安装在容器覆盖内部
现有的node_modules
目录。如果您指定它,则docker将在/var/lib/docker/volumes
中的主机上安装该卷。要找出它的位置,请运行:
docker inspect -f '{{ .Mounts }}' containerid
命令:
docker run -it -v ${PWD}:/usr/src/app -v /usr/src/app/node_modules -p 5000:5000 myapp
打算在开发中执行,以将源安装到容器中,因为在开发映像的构建过程中不会复制源。
完成所有这些操作以使源位于主机上并将模块保留在容器中。原因之一是依赖关系可能取决于操作系统,因此使用节点模块的容器版本进行开发非常重要。
一旦一切都准备好投入生产,则将使用不同的Dockerfile
构建映像,该映像将复制源并安装依赖项。在这种情况下,不会安装任何卷:
docker build -f Dockerfile-prod -t myapp-prod .