Py学习  »  docker

Docker compose构建上下文和Docker卷

ashk • 3 年前 • 1514 次点击  

如果docker构建上下文和卷之间有联系,我很困惑,我有以下docker compose,可以使用一些澄清。
上下文设置为/然后卷引用相同的应用程序/应用程序,该卷是在哪里创建的,因为它没有在下面的卷部分中引用(只包含db_数据,未使用),以及卷的类型是什么意思。提前谢谢

web-client:
 image: some-image
 build:
   context: ./app
   dockerfile: Dockerfile
 ports:
   - "8081:3000"
 volumes:
     - ./app:/opt/app:delegated
     - ./app/package-lock.json:/opt/package-lock.json
     - notused:/opt/app/node_modules
volumes:
  db_data:
  notused:
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128740
文章 [ 1 ]  |  最新文章 3 年前
David Maze
Reply   •   1 楼
David Maze    3 年前

你应该删除它 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中运行数据库和其他依赖项,但在日常开发中使用普通的非容器语言运行时。