Docker Compose documentation,其example use case非常适合您分析不同工作环境(开发,制作等)的各种可能性。
web:
image: example/my_web_app:latest
links:
- db
- cache
db:
image: postgres:latest
cache:
image: redis:latest
然而,对于我来说,使用图像而不是构建时,我并不是很清楚。
这是唯一可用的唯一image: example/my_web_app:latest
示例:&/ p>
另一个常见用例是运行adhoc或管理任务 针对Compose应用中的一项或多项服务。这个例子 演示了如何运行数据库备份。
其他示例案例使用build: .
据我所知,在第一次打开容器时,使用图像覆盖建筑物可以提供更好的性能,因为图像已经准备好了。但是,我可以预见到这样做有很多问题:
:latest
版本(或者你呢?)。:latest
标签),您无法控制正在触摸的文件版本。但是,每当您出现docker-compose up
时,它都会更新到最新的工作版本。以前的一些观点可能并不完全正确。随意拆除它们。
答案 0 :(得分:10)
通常,您希望在以下情况中使用build .
:
这通常在您开发或测试并且代码未生成就绪时完成。例如测试失败,代码无法编译,代码错误等等。
通常,您只能在准备发布部署时创建映像。此时,您将创建图像,通过其标签对其进行版本化并将其推送到您的个人DTR或Docker Hub。
使用docker compose中的版本时,您不必绑定:latest
,您可以指定任何版本,以确保在任何给定环境中运行正确的版本。例如,在生产中,您可能希望创建一个名为docker-production.yaml
的撰写文件,其配置如下:
web:
image: "example/my_web_app:${TAG}"
links:
- db
- cache
db:
image: postgres:9.5.2
cache:
image: redis:3.0.7
其中${TAG}
是在运行时替换的环境变量,例如docker-compose up -d -f docker-production.yaml
。您可以阅读有关变量替换的更多信息here。
撰写的强大之处在于,您可以使用由构建系统自动启动的可变替换创建构建文件,而不再将您限制为:latest
甚至是硬编码版本。
注意:
build .
场景可能都不准确,但是
准确地说我的公司如何使用撰写。build .
而不是docker
build
上下文。答案 1 :(得分:7)
正如@ GHETTO.CHiLD所说,这取决于您的需求和您的工作流程。实际上我们不执行手动构建。我将解释我们如何管理这个以及为什么。它非常适合我们的流程,但不适合其他情况。
有一个docker-compose.yml
用于开发,可以简化环境管理。他们只运行docker-compose up
并从注册表中提取图像并将其安装在容器内。
version: "2"
services:
web:
build:
context: ../../
dockerfile: dockerfiles/dev/Dockerfile
image: registry.my.domain/my_image:dev
volumes:
- ../../:/opt/app
working_dir: /opt/app
如果他们对Dockerfile进行了更改(例如,他们需要一个新库),他们可以在他们的机器中构建映像(docker-compose build
),但不会对注册表推送映像。
dev
图像并运行测试。$TAG
作为图像标记构建生产图像。docker-compose.yml
的敏感数据。为了升级,我们只是从注册表中提取新标签(我们可以自动执行此操作,但我还没有信心在没有人工测试的情况下部署到生产中:D)。 当然,您每次都可以构建图像进行开发,但有些项目可能需要很长时间才能构建。例如,Python3 + pandas可能需要25分钟才能构建,因此如果你不得不经常在项目之间切换,那就太令人沮丧了。另一方面,拉图像只需不到一分钟。
我们使用这种方法,因为GitLab为我们提供了CI,注册表和跑步者来构建图像和运行测试。没有它你就可以做到,但你需要自己集成所有组件。流程并不完美,它有一些缺点,但在我们的场景中很小。