在 docker 中使用美元符号构成构建参数混淆

Using dollar symbol in docker compose build args confusion

当 运行 docker 撰写时,我想从我的 OS (Ubuntu 21.10) 传递我的用户 ID 和组 ID。我这样做是为了创建一个用户,该用户在容器中具有与我当前登录的用户匹配的 ID。

当我(在我的 php-apache 容器中)按如下方式指定构建参数时:

version: '3.8'

services:
  api_php-apache:
    container_name: api_php-apache
    build:
      args:
        USER_ID: ${(id -u)}
        GROUP_ID: ${(id -g)}

我收到以下错误:

invalid interpolation format for services.api_php-apache.build.args.GROUP_ID: "${id -g}". You may need to escape any $ with another $.

但是如果我这样指定:

version: '3.8'

services:
  api_php-apache:
    container_name: api_php-apache
    build:
      args:
        USER_ID: ${UID}
        GROUP_ID: ${GID}

并且我已经在我的 ~/.bashrc 中导出了我的 id -uid -g,它将 id 正确地传递给了命令。

我怎样才能实现正确传递语法的 id -u/id -g 命令?

我的DOCKER-COMPOSE.YML

version: '3.8'

services:
  api_php-database:
    image: postgres
    container_name: api_php-database
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: laravel_docker
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    ports:
      - '5432:5432'
  api_php-apache:
    container_name: api_php-apache
    build:
      context: ./php
      args:
        USER_ID: ${(id -u)}
        GROUP_ID: ${(id -g)}
    ports:
      - '8080:80'
    volumes:
      - ./src:/var/www/laravel_docker
      - ./apache/default.conf:/etc/apache2/sites-enabled/000-default.conf
    depends_on:
      - api_php-database

您不能在 compose.yaml 中使用子 shell。您需要在 运行 撰写之前导出这些变量,然后只需引用变量或将其留空,以便撰写将选取它。

api_php-apache:
  container_name: api_php-apache
  build:
    context: ./php
    args:
      USER_ID: ${USER_ID:-1000}
      GROUP_ID: ${GROUP_ID:-1000}
export USER_ID="$(id -u)"
export GROUP_ID="$(id -g)"
docker compose up --build

按照我这里的做法,如果没有在 .env 文件或当前 shell.

中设置,它将返回到 uid 和 gid 1000