一种将构建时参数从 .env 文件传递到 Docker 的方法
A way to pass build-time arguments from .env file to Docker
有没有一种方法可以将 .env-file 变量从 docker-compose up(或 docker-compose build)调用传递到 Dockerfile 执行环境中,而不需要真正奇怪的黑客攻击?
我需要传递将在构建时环境中使用的 USER NAME 变量以成为该用户。
我今天尝试这样做,并花了 6 个多小时使用不同的方法,但没有一个允许我使用预制的 .env 文件用户变量。遗憾的是,只有当我将用户名硬编码到 Dockerfile 中时,它才对我有用。
我今天花了很多时间在 Whosebug 上阅读所有答案并定制我的环境,但我仍然无法达到我想要做的事情。我知道有很多类似的问题。但他们似乎没有任何帮助...
非常感谢您的帮助!谢谢...
P.S。例子.env:
version: '3'
services:
terra-validator:
image: terra-validator
env_file:
- terra-validator/variables.env
environment:
- NEWUSER=${NEWUSER}
build:
context: terra-validator
dockerfile: Dockerfile
args:
- NEWUSER=$NEWUSER
Docker 文件:
ARG NEWUSER
ENV NEWUSER $NEWUSER
RUN adduser $NEWUSER
USER $NEWUSER
CMD whoami
Adduser 和 useradd 命令不起作用...它们总是打印出相同的 3-4 种类型的错误,具体取决于我的方法...
我通过以下方法解决了类似的问题:
Docker 撰写文件
version: '3'
services:
terra-validator:
image: terra-validator
environment:
- NEWUSER=${NEWUSER}
build:
context: terra-validator
dockerfile: Dockerfile
args:
- NEWUSER=${NEWUSER}
PS: 我删除了 env
文件。
Bash脚本文件
NEWUSER= # For example coming from command line
NEWUSER=${NEWUSER} docker-compose up
让我知道它是否也适合你。
此致。
你没有给出完整的错误,所以这里只给你一个可行的解决方案,仅供参考:
docker-compose.yaml:
version: '3'
services:
terra-validator:
image: terra-validator
build:
context: terra-validator
dockerfile: Dockerfile
args:
- NEWUSER=$NEWUSER
.env:
NEWUSER=tester
terra-validator/Dockerfile:
FROM ubuntu:16.04
ARG NEWUSER
ENV NEWUSER $NEWUSER
RUN adduser $NEWUSER --disabled-password --gecos "First Last,RoomNumber,WorkPhone,HomePhone"
USER $NEWUSER
CMD whoami
执行:
$ docker-compose up
Creating network "20210811_default" with the default driver
Building terra-validator
Step 1/6 : FROM ubuntu:16.04
---> 065cf14a189c
Step 2/6 : ARG NEWUSER
---> Using cache
---> 6c11feb31ac0
Step 3/6 : ENV NEWUSER $NEWUSER
---> Using cache
---> 365472fb8bf2
Step 4/6 : RUN adduser $NEWUSER --disabled-password --gecos "First Last,RoomNumber,WorkPhone,HomePhone"
---> Running in 3156249774f8
Adding user `tester' ...
Adding new group `tester' (1000) ...
Adding new user `tester' (1000) with group `tester' ...
Creating home directory `/home/tester' ...
Copying files from `/etc/skel' ...
Removing intermediate container 3156249774f8
---> 8debf4402db6
Step 5/6 : USER $NEWUSER
---> Running in 5f86175c5d7b
Removing intermediate container 5f86175c5d7b
---> 400f7951c4be
Step 6/6 : CMD whoami
---> Running in 5fe9cf8cc6f8
Removing intermediate container 5fe9cf8cc6f8
---> f63f2e284104
Successfully built f63f2e284104
Successfully tagged terra-validator:latest
WARNING: Image for service terra-validator was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating 20210811_terra-validator_1 ... done
Attaching to 20210811_terra-validator_1
terra-validator_1 | tester
20210811_terra-validator_1 exited with code 0
解释:
.env
中定义的值将由args
在docker-compose.yaml
中使用,然后传递给Dockerfile ARG
。在用户设置过程中,您最好添加 --disabled-password --gecos "First Last,RoomNumber,WorkPhone,HomePhone"
以删除一些错误消息。最后,在 docker-compose up
日志中,您可以看到 whoami
打印出 tester
.
有没有一种方法可以将 .env-file 变量从 docker-compose up(或 docker-compose build)调用传递到 Dockerfile 执行环境中,而不需要真正奇怪的黑客攻击?
我需要传递将在构建时环境中使用的 USER NAME 变量以成为该用户。
我今天尝试这样做,并花了 6 个多小时使用不同的方法,但没有一个允许我使用预制的 .env 文件用户变量。遗憾的是,只有当我将用户名硬编码到 Dockerfile 中时,它才对我有用。
我今天花了很多时间在 Whosebug 上阅读所有答案并定制我的环境,但我仍然无法达到我想要做的事情。我知道有很多类似的问题。但他们似乎没有任何帮助...
非常感谢您的帮助!谢谢...
P.S。例子.env:
version: '3'
services:
terra-validator:
image: terra-validator
env_file:
- terra-validator/variables.env
environment:
- NEWUSER=${NEWUSER}
build:
context: terra-validator
dockerfile: Dockerfile
args:
- NEWUSER=$NEWUSER
Docker 文件:
ARG NEWUSER
ENV NEWUSER $NEWUSER
RUN adduser $NEWUSER
USER $NEWUSER
CMD whoami
Adduser 和 useradd 命令不起作用...它们总是打印出相同的 3-4 种类型的错误,具体取决于我的方法...
我通过以下方法解决了类似的问题:
Docker 撰写文件
version: '3'
services:
terra-validator:
image: terra-validator
environment:
- NEWUSER=${NEWUSER}
build:
context: terra-validator
dockerfile: Dockerfile
args:
- NEWUSER=${NEWUSER}
PS: 我删除了 env
文件。
Bash脚本文件
NEWUSER= # For example coming from command line
NEWUSER=${NEWUSER} docker-compose up
让我知道它是否也适合你。
此致。
你没有给出完整的错误,所以这里只给你一个可行的解决方案,仅供参考:
docker-compose.yaml:
version: '3'
services:
terra-validator:
image: terra-validator
build:
context: terra-validator
dockerfile: Dockerfile
args:
- NEWUSER=$NEWUSER
.env:
NEWUSER=tester
terra-validator/Dockerfile:
FROM ubuntu:16.04
ARG NEWUSER
ENV NEWUSER $NEWUSER
RUN adduser $NEWUSER --disabled-password --gecos "First Last,RoomNumber,WorkPhone,HomePhone"
USER $NEWUSER
CMD whoami
执行:
$ docker-compose up
Creating network "20210811_default" with the default driver
Building terra-validator
Step 1/6 : FROM ubuntu:16.04
---> 065cf14a189c
Step 2/6 : ARG NEWUSER
---> Using cache
---> 6c11feb31ac0
Step 3/6 : ENV NEWUSER $NEWUSER
---> Using cache
---> 365472fb8bf2
Step 4/6 : RUN adduser $NEWUSER --disabled-password --gecos "First Last,RoomNumber,WorkPhone,HomePhone"
---> Running in 3156249774f8
Adding user `tester' ...
Adding new group `tester' (1000) ...
Adding new user `tester' (1000) with group `tester' ...
Creating home directory `/home/tester' ...
Copying files from `/etc/skel' ...
Removing intermediate container 3156249774f8
---> 8debf4402db6
Step 5/6 : USER $NEWUSER
---> Running in 5f86175c5d7b
Removing intermediate container 5f86175c5d7b
---> 400f7951c4be
Step 6/6 : CMD whoami
---> Running in 5fe9cf8cc6f8
Removing intermediate container 5fe9cf8cc6f8
---> f63f2e284104
Successfully built f63f2e284104
Successfully tagged terra-validator:latest
WARNING: Image for service terra-validator was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating 20210811_terra-validator_1 ... done
Attaching to 20210811_terra-validator_1
terra-validator_1 | tester
20210811_terra-validator_1 exited with code 0
解释:
.env
中定义的值将由args
在docker-compose.yaml
中使用,然后传递给Dockerfile ARG
。在用户设置过程中,您最好添加 --disabled-password --gecos "First Last,RoomNumber,WorkPhone,HomePhone"
以删除一些错误消息。最后,在 docker-compose up
日志中,您可以看到 whoami
打印出 tester
.