了解docker卷和卷选项
基于: 我正在尝试运行支持热重新加载的容器。根据上面的指南,运行docker run命令应该可以:了解docker卷和卷选项,docker,Docker,基于: 我正在尝试运行支持热重新加载的容器。根据上面的指南,运行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/ 根据文件: -v的第一个参数是卷的名称。为什么选择名
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/
根据文件:
-v
的第一个参数是卷的名称。为什么选择名称${PWD}
作为名称?在我的例子中,结果是:/home/user/code/sample001
在第二种情况下:
-v /app/node_modules
卷甚至没有名称。与docker文档中的示例进行比较:
$ docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
我看不出-v/app/node\u模块
有什么意义
如果我这样做:
$ 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/
实际上创建的是绑定,而不是卷
我缺少什么?有三种类型的卷:主机卷、匿名卷和命名卷。看
/app/node_modules
是一个匿名卷,由docker直接处理。
如文章所述:
第二个-v标志确保主机节点_模块不会覆盖
容器的节点单元模块。为了确保这一点,我们创建了一个
/usr/src/app/node_模块的卷。如果你要运行docker运行
如果命令中没有第二个-v标志,则会出现错误
vue cli服务:未找到
构建的映像包含app/node\u模块
中的node\u模块
。如果在容器初始化期间未指定匿名卷,则整个app
目录将装载在容器内覆盖
现有的节点\u模块
目录。如果您指定了它,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
是指在开发中执行以将源装入容器中,因为在构建dev映像期间不会复制源
所有这些都是为了将源放在主机上,并将模块保存在容器中。原因之一是依赖关系可能取决于操作系统,因此使用节点模块的容器版本进行开发非常重要
一旦一切就绪可以投入生产,映像将从不同的Dockerfile
构建,该文件将复制源代码并安装依赖项。在这种情况下,没有装入卷:
docker build -f Dockerfile-prod -t myapp-prod .
卷有三种类型:主机卷、匿名卷和命名卷。看
/app/node_modules
是一个匿名卷,由docker直接处理。
如文章所述:
第二个-v标志确保主机节点_模块不会覆盖
容器的节点单元模块。为了确保这一点,我们创建了一个
/usr/src/app/node_模块的卷。如果你要运行docker运行
如果命令中没有第二个-v标志,则会出现错误
vue cli服务:未找到
构建的映像包含app/node\u模块
中的node\u模块
。如果在容器初始化期间未指定匿名卷,则整个app
目录将装载在容器内覆盖
现有的节点\u模块
目录。如果您指定了它,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
是指在开发中执行以将源装入容器中,因为在构建dev映像期间不会复制源
所有这些都是为了将源放在主机上,并将模块保存在容器中。原因之一是依赖关系可能取决于操作系统,因此使用节点模块的容器版本进行开发非常重要
一旦一切就绪可以投入生产,映像将从不同的Dockerfile
构建,该文件将复制源代码并安装依赖项。在这种情况下,没有装入卷:
docker build -f Dockerfile-prod -t myapp-prod .
使用
docker compose
从装载中排除子目录的类似解决方案使用docker compose
从装载中排除子目录的类似解决方案