gpt4 book ai didi

docker - 了解 docker 卷和卷选项

转载 作者:行者123 更新时间:2023-12-02 21:05:08 25 4
gpt4 key购买 nike

基于:

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 文档中的示例进行比较:
$ 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/实际上创建一个绑定(bind)而不是一个卷。

我错过了什么?

最佳答案

存在三种类型的卷:主机、匿名和命名。见 Different Types of Volumes
/app/node_modules是一个匿名卷,由 docker 直接处理。
如文章所述:

the second -v flag ensures that host node_modules does not override the node_modules of the container. To ensure that, we create a data volume for /usr/src/app/node_modules . If you will run the docker run command without the second -v flag then you will get error vue-cli-service: not found.



构建的图像包含 node_modulesapp/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 .

关于docker - 了解 docker 卷和卷选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58552958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com