一种将构建时参数从 .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中定义的值将由argsdocker-compose.yaml中使用,然后传递给Dockerfile ARG。在用户设置过程中,您最好添加 --disabled-password --gecos "First Last,RoomNumber,WorkPhone,HomePhone" 以删除一些错误消息。最后,在 docker-compose up 日志中,您可以看到 whoami 打印出 tester.