使用 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 正确操作。
当 运行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 正确操作。