使用脚本

时间:2017-11-27 19:00:00

标签: shell docker dockerfile

我开始使用Docker,我正在使用Flask进行网络服务。为了连接到数据库,我需要告诉服务要连接的凭据。我不希望将变量直接放在Dockerfile上,或者最糟糕的是放在代码上。我想通过在Dockerfile上调用的shell脚本在构建时设置的环境变量中传递它们。

这里的事情是我尝试使用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'

确认环境变量未设置。

2 个答案:

答案 0 :(得分:1)

您的Dockerfile中有两个CMD语句,这些语句不起作用。你只能有一个CMD语句,所以你的最后一个语句将覆盖第一个语句。

来自Docker documentation

  

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

您需要将CMD合并为一个声明。

见这里:Execute a script before CMD

答案 1 :(得分:0)

您似乎在寻找 .env 文件。

使用您要设置的变量以<variable>=value格式创建文件。

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]”

另外,请查看this part of the docs