为课程开始准备的播客转录翻译
Docker Compose 是一个令人惊叹的工具,用于创建工作
应用程序中使用的堆栈环境。 它允许您定义
应用程序的每个组件都遵循清晰简单的语法
文件
随着。的到来
簇
但这是否意味着您可以在中使用相同的 docker-compose 文件
开发过程和生产环境? 或者使用相同的文件
分期? 嗯,一般来说,是的,但是对于此功能,我们需要以下内容:
- 变量插值:使用环境变量进行某些
每个环境都会改变的价值观。 - 配置覆盖:能够定义第二个(或任何
另一个后续的)docker-compose 文件将更改有关的内容
首先,docker compose 将负责合并两个文件。
开发文件和生产文件之间的差异
在开发过程中,您很可能想要检查代码更改
即时的。 为此,通常将包含源代码的卷安装在
包含应用程序运行时的容器。 但对于生产环境
这种方法不适合。
在生产中,您有一个包含许多节点的集群,并且卷是本地的
相对于容器(或服务)运行的节点,因此您不需要
您可以挂载源代码,无需复杂的操作,包括
代码同步、信号等
相反,我们通常希望使用特定版本的代码创建图像。
习惯上用适当的标签来标记它(您可以使用语义
版本控制或其他系统由您自行决定)。
配置覆盖
鉴于差异以及您的依赖关系在场景中可能有所不同
开发和生产,很明显我们将需要不同的配置文件。
Docker compose 支持将不同的 compose 文件合并到
获得最终配置。 从示例中可以看出其工作原理:
$ cat docker-compose.yml
version: "3.2"
services:
whale:
image: docker/whalesay
command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ________
whale_1 | < hello! >
whale_1 | --------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
如前所述,docker compose 支持组合多个 compose -
文件,这允许您覆盖第二个文件中的各种参数。 例如:
$ cat docker-compose.second.yml
version: "3.2"
services:
whale:
command: ["cowsay", "bye!"]
$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
这种语法在开发过程中不太方便,当命令
需要进行多次。
幸运的是,docker compose 会自动寻找一个名为的特殊文件
docker-compose.override.yml 覆盖值 泊坞窗,compose.yml。 如果
重命名第二个文件,只需使用原始命令即可得到相同的结果:
$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
好吧,这样更容易记住。
变量插值
配置文件支持
变量
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...
如果你这样做 docker-compose 构建(或推送) 没有环境变量
$MY_SERVICE_VERSION,该值将被使用 最新但如果你设置
构建前环境变量的值,构建或推送时将使用该值
到登记处 私有.registry.mine.
我的原则
对我有用的方法可能也对你有用。 我遵循这些
简单的规则:
- 我所有用于生产、开发(或其他环境)的堆栈都是通过定义的
docker-compose 文件 - 配置文件需要尽可能覆盖我的所有环境
避免重复。 - 我需要一个简单的命令来在每种环境中工作。
- 主要配置在文件中定义 泊坞窗,compose.yml.
- 环境变量用于定义图像标签或其他
变量可能因环境而异(暂存、集成、
生产)。 - 生产变量的值用作
默认情况下,如果堆栈在生产环境中启动而无需
设置环境变量。 - 要在生产环境中启动服务,请使用命令 docker stack 部署 - compose-file docker-compose.yml -with-registry-auth my-stack-name.
- 使用命令启动工作环境 码头工人组成up -d.
让我们看一个简单的例子。
# docker-compose.yml
...
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
environment:
API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...
И
# docker-compose.override.yml
...
services:
my-service:
ports: # This is needed for development!
- 80:80
environment:
API_ENDPOINT: https://devel.my-api.com
volumes:
- ./:/project/src
...
我可以用 docker-compose(docker-compose up)运行堆栈
源码挂载的开发模式 /项目/源代码.
我可以在生产中使用这些相同的文件! 我绝对可以使用
相同的文件 泊坞窗,compose.yml 用于演出。 将此扩展为
生产,我只需要构建并发送带有预定义标签的图像
CI阶段:
export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push
在生产中,可以使用以下命令运行:
export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
如果你想在舞台上做同样的事情,你只需要定义
在临时环境中工作所需的环境变量:
export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
结果,我们使用了两个不同的 docker-compose 文件,其中没有
重复配置可用于您拥有的任何环境!
了解有关课程的更多信息
来源: habr.com