你应该删除它
volumes:
完全封锁。这是不必要的,可能会导致不一致的结果。
volumes:
- ./app:/opt/app:delegated
这创造了一个
bind mount
当前位置
/opt/app
容器中的目录是
./app
主机上的目录。Dockerfile在该目录中执行的任何操作(可能是整个安装过程)都是隐藏的。
绑定挂载不是Docker对象,它不会出现在像这样的地方
docker volume ls
.
volumes:
- notused:/opt/app/node_modules
这将替换文件的内容
node_modules
包含Docker内容的目录
named volume
。该命名卷的内容将优先于映像中的内容和绑定装入的父目录中的内容。据Docker所知,该目录包含不透明的用户数据,永远不会更新。也就是说,此设置会导致Docker忽略您的
package.json
文件,即使你重新运行
docker-compose build
.
这种设置利用了Docker命名卷中的一种特殊情况:第一次将空命名卷装入容器时,Docker会将映像的内容复制到该卷中。这只会在第一次运行容器时发生(它不是对映像的一般传递),并且只在Docker命名的卷上发生(不在Kubernetes等其他运行时绑定装载或卷)。
许多设置使用
匿名卷
这里,只列出
/opt/app/node_modules
下面根本没有冒号
卷数:
。这与命名卷的行为相同,只是它没有名称。
volumes:
- ./app/package-lock.json:/opt/package-lock.json
这是一个绑定装载,就像第一个案例一样,但它将文件装载到不同的目录中。这是我前面提到的“不一致的结果”可能出现的一个地方:如果您想使用构建的Docker映像,而不单独分发应用程序源,那么使用绑定挂载重新排列文件意味着有卷和无卷的文件系统布局不同。
我在这样的设置中经常看到的相关问题是执行一些安装步骤或在Dockerfile中移动文件。由于绑定挂载将所有内容都隐藏在容器中,因此所有这些工作都将丢失。想象你
RUN yarn build
; 该图像将包含一个
/opt/app/dist
目录,但绑定挂载隐藏了它。
通常,这种设置的动机是直接处理主机代码,而无需重建映像。但是,卷装载会隐藏映像构建中的所有内容,因此您也可以运行未经修改的
node
形象如果您正在运行代码绑定,那么它将装入未经修改的
节点
如图所示,您也可以在没有Docker参与的情况下运行Node。一个有用的开发设置可以是在Docker中运行数据库和其他依赖项,但在日常开发中使用普通的非容器语言运行时。