Dockerfile:如何从文件内容设置环境变量

时间:2018-08-01 21:02:34

标签: shell docker docker-compose sh posix

我想在Dockerfile中设置一个环境变量。

我有一个Name pizza burger hot dog Mike 1/1/2018 1 0 0 Mike 2/1/2018 0 3 0 Mike 3/1/2018 1 0 0 Mike 4/1/2018 1 0 0 Bob 1/1/2018 0 2 1.5 Bob 2/1/2018 1 0 0 Bob 3/1/2018 0 2 1.5 Bob 4/1/2018 0 2 1.5 文件,看起来像这样: .env

在我的Dockerfile中,我有一个命令来解析该文件的内容并将其分配给FOO。

FOO=bar

我遇到的问题是上面的脚本没有返回我需要的内容。实际上,它什么也不会返回。

我运行RUN 'export FOO=$(echo "$(cut -d'=' -f2 <<< $(grep FOO .env))")'时失败,并显示此错误。

docker-compose up --build

我知道命令The command '/bin/sh -c 'export FOO=$(echo "$(cut -d'=' -f2 <<< $(grep FOO .env))")'' returned a non-zero code: 127会生成正确的输出,但是我不知道如何将输出分配给环境变量。

关于我在做什么错的任何建议?

2 个答案:

答案 0 :(得分:3)

环境变量

如果要在Docker映像中设置许多环境变量(以在容器内使用),则可以简单地在docker-compose.yml文件中使用env_file配置选项。使用该选项,.env文件中的所有条目都将被设置为映像中的环境变量,因此将被设置为容器中的环境变量。

More Info about env_file


构建ARGS

如果您的要求是仅在Dockerfile中使用某些变量,则可以按以下方式指定它们

ARG FOO
ARG FOO1
ARG FOO2
等等...

您必须在build的{​​{1}}键下指定这些参数

docker-compose.yml

More info about args


访问docker-compose.yml文件中的.env值

如果您希望将某些值从.env传递到docker-compose文件中,则只需将.env文件放置在与docker-compose.yml文件相同的位置,然后可以设置以下配置值;

build: context: . args: FOO: BAR FOO1: BAR1 FOO2: BAR2
因此,作为示例,您可以通过在.env文件中设置服务来设置服务的主机端口

Please check this

答案 1 :(得分:2)

首先,您看到的错误。我怀疑问题中未包含“找不到”错误消息。如果真是这样,那么第一个问题是您试图运行一个包含完整字符串的可执行文件,因为您将其用引号引起了。与其尝试运行shell命令“ export”,不如寻找一个二进制文件,该二进制文件是包含所有空格的完整字符串。因此,要解决该错误,您需要取消引号RUN字符串:

RUN export FOO=$(echo "$(cut -d'=' -f2 <<< $(grep FOO .env))")

但是,那不能解决您的根本问题。 RUN命令的结果是,泊坞窗将对文件系统的更改保存为映像的新层。仅保存对文件系统的更改。您正在运行的shell命令更改了外壳状态,但是该外壳退出,运行命令返回,并且该外壳的状态(包括环境变量)消失了。

要为您的应用程序解决此问题,我可以想到两种选择:

选项A:为所有.env值将build args注入到您的版本中,并编写一个脚本,该脚本使用每个变量的正确--build-arg标志调用build。在Dockerfile中,每个变量都有两行:

ARG FOO1=default value1
ARG FOO2=default value2
ENV FOO1=${FOO1} \
    FOO2=${FOO2}

选项B:插入.env文件,并在容器中使用入口点对其进行处理。该入口点可以在启动实际应用程序之前运行导出命令。您还需要在构建中需要这些变量的每个RUN命令中执行此操作。我用于将文件内容提取到环境变量中的一种简写是:

set -a && . .env && set +a