'Using dollar symbol in docker compose build args confusion

When running docker compose I want to pass my user id and group id from my OS (Ubuntu 21.10). I do this so I can create a user that has a matching id in the container to the user I'm currently logged in as.

When I (in my php-apache container) specify build args as follows:

version: '3.8'

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

I receive the following error:

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

But if I specify it like this:

version: '3.8'

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

and I have exported my id -u and id -g in my ~/.bashrc it passes the id's correctly to the command.

How can I achieve this id -u/id -g command that passes the syntax correctly?

MY 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


Solution 1:[1]

You cannot use a subshell inside the compose.yaml. You need to export those before you run compose, and then just reference the variable or leave it empty so compose will pick it up.

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

The way I did it here, it will fall back to uid and gid 1000 if it wasn't set in the .env file or the current shell.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 The Fool