侧边栏壁纸
博主头像
Ivan Zhang

所谓更牛,就是换个罪受

  • 累计撰写 48 篇文章
  • 累计创建 54 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

通过 docker inspect 和 format 获取 Docker Compose 相关信息

Ivan Zhang
2025-02-05 / 0 评论 / 0 点赞 / 72 阅读 / 5,550 字
温馨提示:
本文最后更新于 ,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
有什么问题或观点欢迎评论留言,或者 交流。
如果觉得文章对您有所帮助,可以给博主打赏鼓励一下。

在使用 Docker Compose 管理容器时,有时需要查看容器的相关信息,尤其是与 Docker Compose 相关的配置(如项目名称、工作目录等)。通过 docker inspect 命令结合 formatjq 工具,可以快速提取这些信息。本文将详细介绍如何实现这一目标。


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.projectDocker Compose 项目名称。
com.docker.compose.project.working_dirDocker Compose 项目的工作目录(即 docker-compose.yml 文件所在目录)。
com.docker.compose.service容器所属的服务名称。
com.docker.compose.container-number容器在服务中的编号。
com.docker.compose.versionDocker 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 结合 formatjq,可以快速提取 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
0

评论区