在 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 -u
和 id -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
当 运行 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 -u
和 id -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