如果在DockerCompose中指定多个文件会发生什么?
你不知道吗(老掉牙的笑话)
所以,是由船井総研デジタル的 Advent Calendar 于2023年12月5日由 @fsd-sayhorn 带来!只想知道结果的人可以只读结论就好了!说起来,顺带一提,这可能是我第一次参加 Advent Calendar。
这是什么?
Summary
大家都非常喜欢Docker(可能有点夸张)。
Docker提供了一个名为Compose的功能,可以统一管理多个容器。
Compose使用YAML格式的文件来管理需要控制的容器群和其配置。
例如,下面是一个使用Compose的示例用法。(暂且不考虑Compose文件的内容)
docker compose -f my-compose.yml up
[+] Running 2/2
✔ ubuntu 1 layers [⣿] 0B/0B Pulled 6.8s
✔ f93f952dad40 Pull complete 3.9s
[+] Running 2/2
✔ Network qiita-20231205-dockercompose_default Create... 0.1s
✔ Container qiita-20231205-dockercompose-ubuntu-1 Cre... 0.2s
Attaching to qiita-20231205-dockercompose-ubuntu-1
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_ID=Ubuntu
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_RELEASE=23.04
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_CODENAME=lunar
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_DESCRIPTION="Ubuntu 23.04"
qiita-20231205-dockercompose-ubuntu-1 exited with code 0
my-compose.yml
services:
ubuntu:
image: ubuntu:23.04
command: /bin/bash -c ‘cat /etc/lsb-release’
“cat /etc/lsb-release”是确认发行版信息的一种方式。
您还可以使用lsb_release命令或执行”cat /etc/os-release”来确认。
顺便提一下,您可以使用”uname -a”等命令来确认Linux内核的版本。
以下是此处介绍的各个命令的示例输出:
#在WSL2上运行的Ubuntu 22.04上进行的测试结果
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION=”Ubuntu 22.04.3 LTS”
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.3 LTS
Release: 22.04
Codename: jammy
$ cat /etc/os-release
PRETTY_NAME=”Ubuntu 22.04.3 LTS”
NAME=”Ubuntu”
VERSION_ID=”22.04″
VERSION=”22.04.3 LTS (Jammy Jellyfish)”
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL=”https://www.ubuntu.com/”
SUPPORT_URL=”https://help.ubuntu.com/”
BUG_REPORT_URL=”https://bugs.launchpad.net/ubuntu/”
PRIVACY_POLICY_URL=”https://www.ubuntu.com/legal/terms-and-policies/privacy-policy”
UBUNTU_CODENAME=jammy
$ uname -a
Linux PC-M066 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
在这种用法中,您可以通过-f选项指定任意文件名。本次主题是在指定此文件时指定多个文件会发生什么。
結論 – 總結
如果指定了多个compose.yml文件,则会以指定的文件进行合并操作。
例如,假设有以下文件,在这种情况下,不会拉取ubuntu:22.04镜像,只会拉取ubuntu:23.04镜像。
(因为my-compose-second.yml文件中指定了image,所以my-compose-first.yml文件中指定的ubuntu:22.04镜像会被ubuntu:23.04镜像覆盖)。
実行するコマンド(下記のいずれか)
docker compose -f my-compose-first.yml -f my-compose-second.yml up
COMPOSE_FILE=my-compose-first.yml:my-compose-second.yml docker compose up
-f オプションや COMPOSE_FILE 環境変数の指定順序が重要です。
前(左)に指定されたものから適用され、後(右)に書いたもので上書きされます。
使用するファイル
my-compose-first.yml
services:
ubuntu:
image: ubuntu:22.04
command: /bin/bash -c ‘cat /etc/lsb-release’
my-compose-second.yml
services:
ubuntu:
image: ubuntu:23.04
解说和研究
「前提是需要安装Docker环境。」
$ docker version
Client: Docker Engine - Community
Version: 24.0.7
API version: 1.43
Go version: go1.20.10
Git commit: afdd53b
Built: Thu Oct 26 09:07:41 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
Go version: go1.20.10
Git commit: 311b9ff
Built: Thu Oct 26 09:07:41 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.25
GitCommit: d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f
runc:
Version: 1.1.10
GitCommit: v1.1.10-0-g18a0cb0
docker-init:
Version: 0.19.0
GitCommit: de40ad0
有关指定Compose文件功能
$ docker version
Client: Docker Engine - Community
Version: 24.0.7
API version: 1.43
Go version: go1.20.10
Git commit: afdd53b
Built: Thu Oct 26 09:07:41 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
Go version: go1.20.10
Git commit: 311b9ff
Built: Thu Oct 26 09:07:41 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.25
GitCommit: d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f
runc:
Version: 1.1.10
GitCommit: v1.1.10-0-g18a0cb0
docker-init:
Version: 0.19.0
GitCommit: de40ad0
有关指定Compose文件功能
根据 Docker-docs-ja 24.0/docker compose,可以使用以下方法来指定 Compose 文件,并且可以指定多个文件。
- – 使用 -f 选项
– 使用 -f 标志,指定 Compose 配置文件的位置。
COMPOSE_FILE 环境变量
可以使用包含 -f、-p、–profile 标志的各种 docker compose 选项来指定环境变量。
设置 COMPOSE_FILE 环境变量与传递 -f 标志相同。设置 COMPOSE_PROJECT_NAME 环境变量与传递 -p 标志相同。此外,设置 COMPOSE_PROFILES 环境变量与传递 –profile 标志相同。
如果明确指定了标志,则相关的环境变量将被忽略。
指定多个 Compose 文件
可以添加多个 -f 配置文件。当指定多个文件时,Compose 将将它们合并到一个配置中。Compose 将按照指定的文件顺序进行构建。后续文件将覆盖或添加到先前处理的设置中。
可能可以利用这个功能的情况。
考虑到本功能的特性是可以通过指定的文件内容进行覆盖或追加,因此可以考虑以下利用情境。
- 根据不同的环境创建容器
我认为这是常见的情况,例如,我想在开发环境中安装数据包分析工具,但不想在生产环境中安装。在这种情况下,我们可以创建一个基础的Compose文件,并根据每个环境准备一个只包含差异的Compose文件来应用它。然而,在这种情况下,我们可能需要考虑创建一个共享的基础容器映像,并在其基础上构建差异,这可能更合适。
可能还有其他情况,例如,根据docker主机的CPU架构创建不同的容器。
在不影响其他人创建的Compose文件的情况下,添加自己的自定义设置
常常有这样的需求,即在某个环境中,我想要添加额外的配置或安装工具等。在这种情况下,如果不使用本功能,我们将不得不直接修改Compose文件,或者创建原始Compose文件的副本并进行编辑,这样可能导致双重管理,或者在出现问题时难以进行排除。
通过使用本功能,我们不需要修改原始Compose文件,因此不会出现这些问题。
做实验
搭建使用結論中提到的文件的實驗環境,並觀察實際執行時可能出現的情況。
事前准备
请准备一个工作空间(目录),以便按照下面的结构进行配置。
请注意,本次没有对 dockerd 进行特殊指定,所以假设使用一般的 linux/amd64 环境(本文作者在 Windows Subsystem for Linux 环境中执行此操作)。
版本信息
項目
バージョン
Windows Subsystem for Linux
2.0.9.0
Ubuntu
22.04.3 LTS
docker(client)
24.0.7
docker(server)
24.0.7
Docker Compose
2.21.0
目录结构
$ pwd
/home/username/work/qiita-20231205-dockercompose
$ tree
.
├── my-compose-first.yml
└── my-compose-second.yml
0 directories, 2 files
如果没有安装tree命令,可以使用apt等来安装,达到同样的效果。
※我认为没有必要特意安装tree命令,因为没有使用tree的理由,但您可以根据喜好来决定。
实验开始前容器资源的情况(仅提取相关内容)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker iamges -a
REPOSITORY TAG IMAGE ID CREATED SIZE
node 20.7.0-bullseye-slim a1c6dc3eddfa 2 months ago 253MB
关于 (補足) node:20.7.0-bullseye-slim 镜像:
存在 node:20.7.0-bullseye-slim 镜像,但是在后续的步骤中,我们只提取需要的镜像,所以使用该镜像的创建日期作为筛选条件。
除此之外没有其他用途,该镜像与实验本身本质上无关。
筛选示例:
docker images –filter “since=node:20.7.0-bullseye-slim”
实验结果
根据下列所示,无论是使用 -f 选项还是 COMPOSE_FILE 环境变量,按照所指定的 Compose 文件顺序,每个文件的内容都被合并和执行,得到了与执行的结果相同的效果。可以确定已经按照规范进行了实现。
$ docker compose -f my-compose-first.yml -f my-compose-second.yml up
[+] Running 2/2
✔ ubuntu 1 layers [⣿] 0B/0B Pulled 7.1s
✔ 6360b3717211 Pull complete 2.7s
[+] Running 1/1
✔ Container qiita-20231205-dockercompose-ubuntu-1 Created 0.1s
Attaching to qiita-20231205-dockercompose-ubuntu-1
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_ID=Ubuntu
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_RELEASE=23.04
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_CODENAME=lunar
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_DESCRIPTION="Ubuntu 23.04"
qiita-20231205-dockercompose-ubuntu-1 exited with code 0
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aefa7e06b022 ubuntu:23.04 "/bin/bash -c 'cat /…" 7 seconds ago Exited (0) 5 seconds ago qiita-20231205-dockercompose-ubuntu-1
$ docker images -a --filter "since=node:20.7.0-bullseye-silm"
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 23.04 f4cdeba72b99 4 days ago 70.3MB
$ docker compose -f my-compose-second.yml -f my-compose-first.yml up
[+] Running 2/2
✔ ubuntu 1 layers [⣿] 0B/0B Pulled 7.0s
✔ 5e8117c0bd28 Pull complete 2.8s
[+] Running 1/1
✔ Container qiita-20231205-dockercompose-ubuntu-1 Created 0.1s
Attaching to qiita-20231205-dockercompose-ubuntu-1
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_ID=Ubuntu
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_RELEASE=22.04
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_CODENAME=jammy
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_DESCRIPTION="Ubuntu 22.04.3 LTS"
qiita-20231205-dockercompose-ubuntu-1 exited with code 0
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adfcfbd8db03 ubuntu:22.04 "/bin/bash -c 'cat /…" 10 seconds ago Exited (0) 10 seconds ago qiita-20231205-dockercompose-ubuntu-1
$ docker images -a --filter "since=node:20.7.0-bullseye-silm"
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 b6548eacb063 39 hours ago 77.8MB
$ COMPOSE_FILE=my-compose-first.yml:my-compose-second.yml docker compose up
[+] Running 2/2
✔ ubuntu 1 layers [⣿] 0B/0B Pulled 6.7s
✔ 6360b3717211 Pull complete 2.5s
[+] Running 1/1
✔ Container qiita-20231205-dockercompose-ubuntu-1 Created 0.1s
Attaching to qiita-20231205-dockercompose-ubuntu-1
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_ID=Ubuntu
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_RELEASE=23.04
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_CODENAME=lunar
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_DESCRIPTION="Ubuntu 23.04"
qiita-20231205-dockercompose-ubuntu-1 exited with code 0
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
104e117f1ca5 ubuntu:23.04 "/bin/bash -c 'cat /…" 7 seconds ago Exited (0) 6 seconds ago qiita-20231205-dockercompose-ubuntu-1
$ docker images -a --filter "since=node:20.7.0-bullseye-silm"
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 23.04 f4cdeba72b99 4 days ago 70.3MB
$ COMPOSE_FILE=my-compose-second.yml:my-compose-first.yml docker compose up
[+] Running 2/2
✔ ubuntu 1 layers [⣿] 0B/0B Pulled 7.0s
✔ 5e8117c0bd28 Pull complete 2.7s
[+] Running 1/1
✔ Container qiita-20231205-dockercompose-ubuntu-1 Created 0.1s
Attaching to qiita-20231205-dockercompose-ubuntu-1
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_ID=Ubuntu
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_RELEASE=22.04
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_CODENAME=jammy
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_DESCRIPTION="Ubuntu 22.04.3 LTS"
qiita-20231205-dockercompose-ubuntu-1 exited with code 0
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d2b7aac45bf ubuntu:22.04 "/bin/bash -c 'cat /…" 7 seconds ago Exited (0) 6 seconds ago qiita-20231205-dockercompose-ubuntu-1
$ docker images -a --filter "since=node:20.7.0-bullseye-silm"
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 b6548eacb063 39 hours ago 77.8MB
我总结一下。
我最近在测试能够指定多个Compose文件的功能。
尽管Docker在实际工作中被广泛使用,但是随着产品的发展,Docker的规范也在不断增加,所以可能还有许多我不知道的功能。
我很想深入研究一下,比如–isolation的工作原理。
尽管我知道年末和财年末的人们都很忙,但请度过一个愉快的工程师生活吧。
目录结构
$ pwd
/home/username/work/qiita-20231205-dockercompose
$ tree
.
├── my-compose-first.yml
└── my-compose-second.yml
0 directories, 2 files
如果没有安装tree命令,可以使用apt等来安装,达到同样的效果。
※我认为没有必要特意安装tree命令,因为没有使用tree的理由,但您可以根据喜好来决定。
实验开始前容器资源的情况(仅提取相关内容)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker iamges -a
REPOSITORY TAG IMAGE ID CREATED SIZE
node 20.7.0-bullseye-slim a1c6dc3eddfa 2 months ago 253MB
关于 (補足) node:20.7.0-bullseye-slim 镜像:
存在 node:20.7.0-bullseye-slim 镜像,但是在后续的步骤中,我们只提取需要的镜像,所以使用该镜像的创建日期作为筛选条件。
除此之外没有其他用途,该镜像与实验本身本质上无关。
筛选示例:
docker images –filter “since=node:20.7.0-bullseye-slim”
实验结果
$ pwd
/home/username/work/qiita-20231205-dockercompose
$ tree
.
├── my-compose-first.yml
└── my-compose-second.yml
0 directories, 2 files
※我认为没有必要特意安装tree命令,因为没有使用tree的理由,但您可以根据喜好来决定。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker iamges -a
REPOSITORY TAG IMAGE ID CREATED SIZE
node 20.7.0-bullseye-slim a1c6dc3eddfa 2 months ago 253MB
存在 node:20.7.0-bullseye-slim 镜像,但是在后续的步骤中,我们只提取需要的镜像,所以使用该镜像的创建日期作为筛选条件。
除此之外没有其他用途,该镜像与实验本身本质上无关。
筛选示例:
docker images –filter “since=node:20.7.0-bullseye-slim”
实验结果
根据下列所示,无论是使用 -f 选项还是 COMPOSE_FILE 环境变量,按照所指定的 Compose 文件顺序,每个文件的内容都被合并和执行,得到了与执行的结果相同的效果。可以确定已经按照规范进行了实现。
$ docker compose -f my-compose-first.yml -f my-compose-second.yml up
[+] Running 2/2
✔ ubuntu 1 layers [⣿] 0B/0B Pulled 7.1s
✔ 6360b3717211 Pull complete 2.7s
[+] Running 1/1
✔ Container qiita-20231205-dockercompose-ubuntu-1 Created 0.1s
Attaching to qiita-20231205-dockercompose-ubuntu-1
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_ID=Ubuntu
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_RELEASE=23.04
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_CODENAME=lunar
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_DESCRIPTION="Ubuntu 23.04"
qiita-20231205-dockercompose-ubuntu-1 exited with code 0
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aefa7e06b022 ubuntu:23.04 "/bin/bash -c 'cat /…" 7 seconds ago Exited (0) 5 seconds ago qiita-20231205-dockercompose-ubuntu-1
$ docker images -a --filter "since=node:20.7.0-bullseye-silm"
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 23.04 f4cdeba72b99 4 days ago 70.3MB
$ docker compose -f my-compose-second.yml -f my-compose-first.yml up
[+] Running 2/2
✔ ubuntu 1 layers [⣿] 0B/0B Pulled 7.0s
✔ 5e8117c0bd28 Pull complete 2.8s
[+] Running 1/1
✔ Container qiita-20231205-dockercompose-ubuntu-1 Created 0.1s
Attaching to qiita-20231205-dockercompose-ubuntu-1
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_ID=Ubuntu
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_RELEASE=22.04
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_CODENAME=jammy
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_DESCRIPTION="Ubuntu 22.04.3 LTS"
qiita-20231205-dockercompose-ubuntu-1 exited with code 0
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adfcfbd8db03 ubuntu:22.04 "/bin/bash -c 'cat /…" 10 seconds ago Exited (0) 10 seconds ago qiita-20231205-dockercompose-ubuntu-1
$ docker images -a --filter "since=node:20.7.0-bullseye-silm"
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 b6548eacb063 39 hours ago 77.8MB
$ COMPOSE_FILE=my-compose-first.yml:my-compose-second.yml docker compose up
[+] Running 2/2
✔ ubuntu 1 layers [⣿] 0B/0B Pulled 6.7s
✔ 6360b3717211 Pull complete 2.5s
[+] Running 1/1
✔ Container qiita-20231205-dockercompose-ubuntu-1 Created 0.1s
Attaching to qiita-20231205-dockercompose-ubuntu-1
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_ID=Ubuntu
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_RELEASE=23.04
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_CODENAME=lunar
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_DESCRIPTION="Ubuntu 23.04"
qiita-20231205-dockercompose-ubuntu-1 exited with code 0
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
104e117f1ca5 ubuntu:23.04 "/bin/bash -c 'cat /…" 7 seconds ago Exited (0) 6 seconds ago qiita-20231205-dockercompose-ubuntu-1
$ docker images -a --filter "since=node:20.7.0-bullseye-silm"
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 23.04 f4cdeba72b99 4 days ago 70.3MB
$ COMPOSE_FILE=my-compose-second.yml:my-compose-first.yml docker compose up
[+] Running 2/2
✔ ubuntu 1 layers [⣿] 0B/0B Pulled 7.0s
✔ 5e8117c0bd28 Pull complete 2.7s
[+] Running 1/1
✔ Container qiita-20231205-dockercompose-ubuntu-1 Created 0.1s
Attaching to qiita-20231205-dockercompose-ubuntu-1
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_ID=Ubuntu
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_RELEASE=22.04
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_CODENAME=jammy
qiita-20231205-dockercompose-ubuntu-1 | DISTRIB_DESCRIPTION="Ubuntu 22.04.3 LTS"
qiita-20231205-dockercompose-ubuntu-1 exited with code 0
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d2b7aac45bf ubuntu:22.04 "/bin/bash -c 'cat /…" 7 seconds ago Exited (0) 6 seconds ago qiita-20231205-dockercompose-ubuntu-1
$ docker images -a --filter "since=node:20.7.0-bullseye-silm"
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 b6548eacb063 39 hours ago 77.8MB
我总结一下。
我最近在测试能够指定多个Compose文件的功能。
尽管Docker在实际工作中被广泛使用,但是随着产品的发展,Docker的规范也在不断增加,所以可能还有许多我不知道的功能。
我很想深入研究一下,比如–isolation的工作原理。
尽管我知道年末和财年末的人们都很忙,但请度过一个愉快的工程师生活吧。