我想在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
会生成正确的输出,但是我不知道如何将输出分配给环境变量。
关于我在做什么错的任何建议?
答案 0 :(得分:3)
如果要在Docker映像中设置许多环境变量(以在容器内使用),则可以简单地在docker-compose.yml文件中使用env_file
配置选项。使用该选项,.env文件中的所有条目都将被设置为映像中的环境变量,因此将被设置为容器中的环境变量。
如果您的要求是仅在Dockerfile
中使用某些变量,则可以按以下方式指定它们
ARG FOO
ARG FOO1
ARG FOO2
等等...
您必须在build
的{{1}}键下指定这些参数
docker-compose.yml
如果您希望将某些值从.env传递到docker-compose文件中,则只需将.env文件放置在与docker-compose.yml文件相同的位置,然后可以设置以下配置值;
build:
context: .
args:
FOO: BAR
FOO1: BAR1
FOO2: BAR2
因此,作为示例,您可以通过在.env文件中设置服务来设置服务的主机端口
答案 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