了解Docker卷和卷选项

时间:2019-10-25 06:00:17

标签: docker

基于:

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/实际上创建一个绑定而不是一个卷。

我想念什么?

1 个答案:

答案 0 :(得分:2)

共有三种类型的卷:主机卷,匿名卷和命名卷。参见Different Types of Volumes

/app/node_modules是一个匿名卷,由Docker直接处理。 如文章所述:

  

第二个-v标志确保主机node_modules不被覆盖   容器的nod​​e_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 .