在使用 Docker Compose 管理容器时,有时需要查看容器的相关信息,尤其是与 Docker Compose 相关的配置(如项目名称、工作目录等)。通过
docker inspect
命令结合format
和jq
工具,可以快速提取这些信息。本文将详细介绍如何实现这一目标。
1. 使用 docker inspect
查看容器信息
docker inspect
是 Docker 提供的一个强大命令,用于查看容器、镜像、网络等的详细信息。通过指定 --format
参数,可以提取特定的字段。
基本用法
docker inspect <容器名称或ID>
提取 Labels
信息
Docker Compose 会在容器的 Labels
中添加一些元数据,例如项目名称、工作目录等。可以通过以下命令提取 Labels
:
docker inspect <容器名称或ID> --format='{{json .Config.Labels}}'
2. 使用 jq
过滤特定前缀的属性
jq
是一个轻量级的命令行 JSON 处理器,可以方便地过滤和提取 JSON 数据中的特定字段。
安装 jq
- Ubuntu/Debian:
sudo apt install jq
- CentOS/RHEL:
sudo yum install jq
- macOS:
brew install jq
过滤 com.docker.compose
前缀的属性
运行以下命令,提取 Labels
中所有以 com.docker.compose
开头的属性:
docker inspect <容器名称或ID> --format='{{json .Config.Labels}}' | jq 'with_entries(select(.key | startswith("com.docker.compose")))'
示例输出
假设 Labels
内容如下:
{
"com.docker.compose.project": "my_project",
"com.docker.compose.project.working_dir": "/path/to/docker-compose.yml",
"other.label": "value"
}
运行上述命令后,输出将是:
{
"com.docker.compose.project": "my_project",
"com.docker.compose.project.working_dir": "/path/to/docker-compose.yml"
}
3. 提取特定属性
如果只需要某个特定属性(例如 com.docker.compose.project.working_dir
),可以进一步过滤:
docker inspect <容器名称或ID> --format='{{json .Config.Labels}}' | jq '."com.docker.compose.project.working_dir"'
示例输出
"/path/to/docker-compose.yml"
4. 常用 Docker Compose 相关属性
以下是一些常见的 com.docker.compose
属性及其含义:
属性名称 | 描述 |
---|---|
com.docker.compose.project | Docker Compose 项目名称。 |
com.docker.compose.project.working_dir | Docker Compose 项目的工作目录(即 docker-compose.yml 文件所在目录)。 |
com.docker.compose.service | 容器所属的服务名称。 |
com.docker.compose.container-number | 容器在服务中的编号。 |
com.docker.compose.version | Docker Compose 文件版本。 |
5. 完整示例
假设容器名称为 my_container
,以下是一个完整的示例:
提取所有 com.docker.compose
属性
docker inspect my_container --format='{{json .Config.Labels}}' | jq 'with_entries(select(.key | startswith("com.docker.compose")))'
提取 com.docker.compose.project.working_dir
docker inspect my_container --format='{{json .Config.Labels}}' | jq '."com.docker.compose.project.working_dir"'
6. 总结
通过 docker inspect
结合 format
和 jq
,可以快速提取 Docker Compose 相关的配置信息。这种方法特别适用于自动化脚本或调试场景,能够高效地获取容器的工作目录、项目名称等关键信息。
如果你需要进一步处理 JSON 数据,可以参考 jq
的官方文档:jq Manual。
附录:自动化提取脚本
以下是一个 Bash 脚本,用于提取 Docker Compose 容器的标签信息。
#!/bin/bash
# 作者: Ivan Zhang
# 日期: 2025/02/05
# 说明: 该脚本用于提取 Docker 容器的标签信息,特别是与 Docker Compose 相关的标签。
# 使用方法: bash get_docker_compose_labels.sh <容器名称或ID> [选项] [自定义标签]
# 选项:
# --release, -r 查找 release 信息
# --version, -v 查找 version 信息
# --file, -f 查找 com.docker.compose.project.config_files 信息
# --dir, -d 查找 com.docker.compose.project.working_dir 信息
# --name, -n 查找 name 信息
# --project, -p 查找 com.docker.compose.project 信息
# <label_prefix> 自定义标签
# 检查参数数量
if [ "$#" -lt 1 ]; then
echo "用法: $0 <容器名称或ID> [选项] [自定义标签]"
echo "选项:"
echo " --release, -r 查找 release 信息"
echo " --version, -v 查找 version 信息"
echo " --file, -f 查找 com.docker.compose.project.config_files 信息"
echo " --dir, -d 查找 com.docker.compose.project.working_dir 信息"
echo " --name, -n 查找 name 信息"
echo " --project, -p 查找 com.docker.compose.project 信息"
echo " <label_prefix> 自定义标签"
exit 1
fi
# 参数
CONTAINER_NAME_OR_ID=$1
shift
# 标签前缀列表(精准匹配)
LABEL_PREFIXES=()
# 使用getopt解析选项
PARSED_OPTIONS=$(getopt -o rvfdnp --long release,version,file,dir,name,project -- "$@")
if [ $? -ne 0 ]; then
echo "参数解析错误"
exit 1
fi
# 评估解析后的参数
eval set -- "$PARSED_OPTIONS"
# 处理每个选项
while true; do
case "$1" in
-r|--release)
LABEL_PREFIXES+=("release")
shift
;;
-v|--version)
LABEL_PREFIXES+=("version")
shift
;;
-f|--file)
LABEL_PREFIXES+=("com.docker.compose.project.config_files")
shift
;;
-d|--dir)
LABEL_PREFIXES+=("com.docker.compose.project.working_dir")
shift
;;
-n|--name)
LABEL_PREFIXES+=("name")
shift
;;
-p|--project)
LABEL_PREFIXES+=("com.docker.compose.project")
shift
;;
--)
shift
break
;;
*)
echo "未知的选项: $1"
exit 1
;;
esac
done
# 处理剩余的自定义标签前缀(用于模糊匹配)
CUSTOM_PREFIXES=("$@")
# 检查输入是名称还是 ID
if [[ "$(docker ps -q -f "id=${CONTAINER_NAME_OR_ID}")" == "${CONTAINER_NAME_OR_ID}" ]]; then
# 输入是容器 ID
CONTAINER_ID=${CONTAINER_NAME_OR_ID}
else
# 输入是容器名称,使用正则表达式匹配完整名称
CONTAINER_ID=$(docker ps --filter "name=^/${CONTAINER_NAME_OR_ID}$" --format "{{.ID}}" | head -n 1)
fi
# 检查是否成功获取
if [ -z "$CONTAINER_ID" ]; then
echo "未找到与输入 '${CONTAINER_NAME_OR_ID}' 相关的容器,请确保输入正确。"
exit
fi
# 获取所有标签信息
LABELS_JSON=$(docker inspect "$CONTAINER_ID" --format='{{json .Config.Labels}}')
# 如果没有任何自定义前缀和选项,显示所有标签
if [ ${#LABEL_PREFIXES[@]} -eq 0 ] && [ ${#CUSTOM_PREFIXES[@]} -eq 0 ]; then
echo "所有标签:"
echo "$LABELS_JSON" | jq
exit
fi
# 合并标签信息
COMBINED_LABELS=""
# 使用 docker inspect 和 jq 提取标签信息(精准匹配)
for PREFIX in "${LABEL_PREFIXES[@]}"; do
echo "正在查找标签: ${PREFIX}"
LABEL_VALUES=$(docker inspect $CONTAINER_ID --format='{{json .Config.Labels}}' | jq "with_entries(select(.key == \"${PREFIX}\"))")
# 仅当结果非空时添加到合并标签中
if [ -n "$LABEL_VALUES" ] && [ "$LABEL_VALUES" != "{}" ]; then
COMBINED_LABELS+="$LABEL_VALUES"$'\n'
fi
done
# 使用 docker inspect 和 jq 提取标签信息(模糊匹配)
for PREFIX in "${CUSTOM_PREFIXES[@]}"; do
echo "正在模糊查找自定义标签: ${PREFIX}"
LABEL_VALUES=$(docker inspect $CONTAINER_ID --format='{{json .Config.Labels}}' | jq "with_entries(select(.key | test(\"${PREFIX}\")))")
# 仅当结果非空时添加到合并标签中
if [ -n "$LABEL_VALUES" ] && [ "$LABEL_VALUES" != "{}" ]; then
COMBINED_LABELS+="$LABEL_VALUES"$'\n'
fi
done
# 显示合并结果
if [ -n "$COMBINED_LABELS" ]; then
echo "标签信息:"
echo "$COMBINED_LABELS" | jq -s 'add'
else
echo "未找到匹配的标签,针对容器 '${CONTAINER_NAME_OR_ID}'."
fi
评论区