You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose构建参数未正确求值,groupadd报错无效组ID

问题

我有一个Dockerfile,内容如下:

ARG GROUP_ID=1000
RUN groupadd -g $GROUP_ID foo

同时有一个compose.yaml文件,其中声明的容器配置如下:

services:
  bar:
    build:
      args:
        GROUP_ID: "$(id -g)"

执行docker compose build bar命令时失败,报错信息为:

groupadd: invalid group ID '$(id'

为何$(id -g)未被完整识别并正确求值?

原因分析

问题出在两个关键点:

  1. YAML双引号的拆分行为:用双引号包裹"$(id -g)"时,YAML会将空格作为分隔符,把$(id -g)拆成$(id和-g)两部分,导致Docker Compose只传递了前半段$(id给构建参数,这直接引发了无效组ID的错误。
  2. Docker Compose不自动执行shell命令替换:即便YAML不拆分字符串,Docker Compose本身也不会主动解析并执行$(id -g)这类shell命令,它只会把字符串原样传递给构建阶段。
解决方法

有两种实用的解决方式:

方式一:shell提前求值后传入

先在shell中计算出当前用户组ID,再通过环境变量传递给Docker Compose:

GROUP_ID=$(id -g) docker compose build bar

同时修改compose.yaml,直接引用该环境变量:

services:
  bar:
    build:
      args:
        GROUP_ID: ${GROUP_ID}

方式二:去掉双引号让shell解析

删除compose.yaml中的双引号,让执行docker compose的shell负责解析命令替换:

services:
  bar:
    build:
      args:
        GROUP_ID: $(id -g)

这种方式下,YAML会把$(id -g)当作完整字符串,由shell执行命令后将结果作为构建参数传入。

内容的提问来源于stack exchange,提问作者marcosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:32:34