如何通过env文件在docker run中传递环境变量?

11

考虑到这个Dockerfile:

FROM alpine:3.7
ENV LAST_UPDATED=2018-02-22
ARG XDG_CACHE_HOME=/tmp/cache/
RUN apk update && \
    apk add libxslt && \
    apk add sed && \
    apk add py-pip && \
    apk add mariadb-client && \
    apk add bash bash-doc bash-completion && \
    pip install httpie && \
    rm -rf /var/cache/apk/*
WORKDIR /usr/deleter/
COPY delete.sh ./
ENTRYPOINT ["/usr/deleter/delete.sh"]

我希望能够通过 .env 文件以 key=value 格式传递多个变量。

$ cat stage.env 
MYSQL_DATABASE=database
MYSQL_HOST=127.0.0.1:3306
MYSQL_PASSWORD=password
MYSQL_PORT=3306
MYSQL_USER=a_user

我的 delete.sh 只有这样:

#!/bin/bash
set -e
set -o pipefail
echo "hello world"
echo ${MYSQL_DATABASE} ${MYSQL_HOST} ${MYSQL_PASSWORD} ${MYSQL_PORT} ${MYSQL_USER}
echo "ALL VARIABLES"
env

我本希望看到环境变量,但它们都是空的。似乎--env-file选项无效。脚本的输出如下:

hello world

ALL VARIABLES
HOSTNAME=f52c5c2aa22b
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/usr/deleter
LAST_UPDATED=2018-02-22
SHLVL=1
HOME=/root
_=/usr/bin/env

我通过以下方式创建并运行Docker容器:

docker build -t deleter:local
docker run deleter:local --env-file stage.env

我尝试了--env-file stage.env, --env-file=stage.env, --env-file ./stage.env等命令,但是似乎没有任何变量被包含或者错误抛出。我还尝试使用绝对路径。

stage.env和我的Dockerfile位于同一级别。

这个环境文件是有效的,我可以在我的本地机器上使用它,并访问其中的变量。

我的错误在哪里?

1个回答

22

请注意,docker run的参数顺序是强制性的:


$ docker help run 
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

设置环境可选项包括:


 -e, --env list                       Set environment variables
     --env-file list                  Read in a file of environment 

因此:
docker run --env-file stage.env deleter:local

将会按预期导入环境变量。

必须在--env-file和LIST_FILENAME之间放置一个等号,例如docker run --env-file=.env_prd ... - perelin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接