Max*_*Max 4 docker docker-compose docker-swarm
假设我们有以下内容docker-compose.yml:
version: '3'
services:
db:
image: "postgres"
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=mysecretpassword
web:
build: web
depends_on: [ db ]
ports:
- "80:80"
Run Code Online (Sandbox Code Playgroud)
第一个服务,db只运行一个容器,其中包含来自 Docker Hub 的官方 postgres 映像。
第二个服务 ,web首先基于Dockerfile文件夹中的构建一个新图像,该文件夹也称为web,然后使用该图像运行一个容器。
在开发过程中,我们现在可以(反复)更改web文件夹中的任何内容,然后运行docker-compose up --build以在本地运行我们的应用程序。
假设我们现在想要部署到生产环境。我的理解是docker-compose.yml现在可用于“在 Docker 的群模式中定义堆栈”(例如,请参阅此答案)。但是,对于服务的build步骤web,Docker 的撰写文件文档指出
在使用(版本 3)Compose 文件以 swarm 模式部署堆栈时,将忽略此选项。docker stack 命令只接受预先构建的镜像。
无论如何,在生产机器上构建映像可能不是一个好主意,因为这会留下构建工件(源代码);这应该发生在构建服务器上。
我的问题是,是否有修改建议的方式docker-compose.yml途中生产,以换出build: web与image: <id>不知何故?
没有关于在生产中使用 Compose 的内容。我的方法一般有什么问题吗?
docker-compose.yml 应该只包含规范的服务定义。
任何特定于构建环境的东西(例如 dev vs prod)都应该在单独的文件中声明docker-compose.override.yml。每个构建环境都可以拥有自己的该文件版本。
该build: web声明不属于docker-compose.yml,因为它只应该在本地运行(并且可能在构建服务器上),而不是在生产中运行。
因此,在上面的示例中,这docker-compose.yml应该是这样的:
version: '3'
services:
db:
image: "postgres"
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=mysecretpassword
web:
depends_on: [ db ]
ports:
- "80:80"
Run Code Online (Sandbox Code Playgroud)
这将是docker-compose.override.yml本地开发的默认设置:
version: '3'
services:
web:
build: web
Run Code Online (Sandbox Code Playgroud)
运行docker-compose up --build -d现在将构建最新的代码更改并在本地启动我们的应用程序。
也可能有另一个版本docker-compose.override.build.yml,针对构建/CI 服务器:
version: '3'
services:
web:
build: web
image: mydockeruser/web
Run Code Online (Sandbox Code Playgroud)
运行docker-compose -f docker-compose.yml -f docker-compose.override.build.yml push将构建最新的代码更改并将映像推送到其注册表/存储库。
最后,可能还有另一个版本docker-compose.override.prod.yml:
version: '3'
services:
web:
image: mydockeruser/web
Run Code Online (Sandbox Code Playgroud)
部署到生产(只是一个单一的码头工人的主机,而不是一个集群)现在可以很简单,因为只有在复制docker-compose.yml和docker-compose.override.prod.yml运行docker-compose -f docker-compose.yml -f docker-compose.override.prod.yml up -d。
| 归档时间: |
|
| 查看次数: |
2981 次 |
| 最近记录: |