通过脚本将dockerfile中的环境variables传递给dockerfile

我开始使用Docker,并使用Flask制作web服务。 为了连接到数据库,我需要告诉服务连接的凭据。 我不想把variables直接放在Dockerfile上,或者放在代码上。 我想通过在Dockerfile上调用的shell脚本通过在构build时设置的环境variables传递它们。

这里的事情是我已经尝试使用CMD,RUN和ENTRYPOINT来实现这一目标而没有成功。

这是我的Dockerfile的最后一个版本:

FROM python:2.7-slim WORKDIR /app ADD . /app RUN pip install --upgrade pip RUN pip install -r requirements.txt EXPOSE 5000 ENTRYPOINT ["python"] CMD ["/app/con.sh"] CMD ["-u","app.py"] 

该脚本被命名为con.sh,并具有这样的结构:

 export REDSHIFT_HOST="[Host of the DB]" export REDSHIFT_USER="[DB user]" export REDSHIFT_PASSWD="[DB password]" export POSTGRES_DB="[DB name]" export MODEL_IP="[endpoint of another service]" export USER_SF="[user]" export PASS_SF="[pass]" export TOKEN="[Token]" export INSTANCE_URL="[URL]" 

我从中得到的是:

  Traceback (most recent call last): File "app.py", line 4, in <module> from clean_leads import * File "/app/clean_leads.py", line 13, in <module> HOST = os.environ['REDSHIFT_HOST'] File "/usr/local/lib/python2.7/UserDict.py", line 40, in __getitem__ raise KeyError(key) KeyError: 'REDSHIFT_HOST' 

这证实环境variables没有被设置。

你的Dockerfile中有两个CMD语句,这是不行的。 你只能有1个CMD语句,所以你最后一个要覆盖第一个。

从Docker文档 :

Dockerfile中只能有一个CMD指令。 如果列出多个CMD,则只有最后一个CMD才会生效。

你需要把你的CMD合并成一个语句。

请参阅: 在CMD之前执行脚本

您似乎正在寻找一个.env文件。

使用要设置的variables以<variable>=value格式创build一个文件。

 REDSHIFT_HOST="[Host of the DB]" REDSHIFT_USER="[DB user]" REDSHIFT_PASSWD="[DB password]" # ... 

然后通过–env-file选项将它传递给你的运行命令(例如命名为.env ):

 sudo docker run --rm -ti --env-file .env alpine sh 

然后你可以检查echo $REDSHIFT_HOST的输出:

“[DB的主持人]”

另外,看看这部分的文档 。