【问题标题】:A way to pass build-time arguments from .env file to Docker一种将构建时参数从 .env 文件传递​​到 Docker 的方法
【发布时间】:2021-08-11 04:04:11
【问题描述】:

有没有办法将 .env-file 变量从 docker-compose up(或 docker-compose build)调用传递到 Dockerfile 执行环境中,而不需要真正奇怪的 hack?

我需要传递将在构建时环境中使用的 USER NAME 变量才能成为该用户。

我今天尝试这样做,并用不同的方法花费了 6 多个小时,但没有一种方法允许我使用预制的 .env 文件用户变量。遗憾的是,只有当我将用户名硬编码到 Dockerfile 中时,它才对我有用。

我今天在 stackoverflow 上花了很多时间阅读所有答案并定制我的环境,但我仍然无法达到我想要做的事情。我知道有很多类似的问题。但他们似乎没有任何帮助......

我们将不胜感激!谢谢...

附:示例 .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

Dockerfile:

ARG NEWUSER
ENV NEWUSER $NEWUSER
RUN adduser $NEWUSER
USER $NEWUSER
CMD whoami

Adduser 和 useradd 命令不起作用...根据我的方法,它们总是打印出相同的 3-4 类错误...

【问题讨论】:

  • #1 如果你的 Dockerfile 需要一个 .env 文件,为什么不在你的 Dockerfile 附近创建它并使用 COPY 或 ADD 呢? #2 您是否需要在 docker build 时刻发送一个简单的字符串以在您的 Dockerfile 中使用?例如,接收一个字符串并以该字符串为名称创建一个文件夹?
  • 你的 Docker 镜像不应该依赖于任何特定的主机用户;如果其他用户运行它,您不必重建您的图像。可以在 Dockerfile 中使用固定的用户名吗?如果您在执行此操作时遇到问题,您可以编辑示例以获得更多详细信息吗?

标签: docker docker-compose environment-variables


【解决方案1】:

我通过followinf方法解决了一个类似的问题:

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=$1 # For example coming from command line
NEWUSER=${NEWUSER} docker-compose up

让我知道它是否也适合你。

问候。

【讨论】:

  • 谢谢,这对我来说效果很好。
  • 好吧!如果你愿意,也请点赞。 :)
【解决方案2】:

你没有给出完整的错误,所以这里只是给你一个可行的解决方案,仅供参考:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多