使用 docker-compose 时如何将主机用户传递给 Dockerfile

how to pass host user to Dockerfile when using docker-compose

当 运行ning docker-compose build

时,我试图将主机变量传递给 Dockerfile

我愿意运行

RUN usermod -u $USERID www-data

apache-php7 Dockerfile 中。 $USERID为当前宿主用户的ID。

我认为以下方法可能有效:

命令行

EXPORT USERID=$(id -u); docker-compose build

docker-compose.yml

...
environment:
    - USERID=$USERID

Dockerfile

ENV USERID 
RUN usermod -u $USERID www-data

但还没有运气。

对于Docker一般来说在build阶段一般不可能使用主机环境变量;这是因为如果您 运行 docker build 和我 运行 docker build 使用相同的 Docker 文件(或 Docker Hub 运行s `docker 使用相同的 Docker 文件构建),我们最终得到相同的图像,无论我们的本地环境如何。

虽然在 运行 时间 传递变量很容易使用 docker 命令行(使用 -e <var>=<value>),但有点棘手使用 docker-compose,因为该工具旨在创建独立的环境。

一个简单的解决方案是在启动容器之前将主机 uid 放入环境文件中。也就是说,假设您有:

version: "2"

services:
  shell:
    image: alpine
    env_file: docker-compose.env
    command: >
      env

然后您可以:

echo HOST_UID=$UID > docker-compose.env; docker-compose up

并且 HOST_UID 环境变量将对您可用 容器:

Recreating vartest_shell_1
Attaching to vartest_shell_1
shell_1  | HOSTNAME=17423d169a25
shell_1  | HOST_UID=1000
shell_1  | HOME=/root
vartest_shell_1 exited with code 0

然后你会得到类似 ENTRYPOINT 脚本的东西 将设置容器环境(创建用户,修改文件 所有权)以使用给定的 UID 正确操作。