shell - 使用脚本在dockerfile中传递环境变量

标签 shell docker dockerfile

我开始使用Docker,并使用Flask制作Web服务。为了连接到数据库,我需要告诉服务要连接的凭据。我不想将变量直接放在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'

确认没有设置环境变量。

最佳答案

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

Docker documentation:

There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.



您需要将CMD合并为一个语句。

看到这里:Execute a script before CMD

关于shell - 使用脚本在dockerfile中传递环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47518002/

相关文章:

shell - Apple 文件系统 (APFS) 检查文件是否是终端(shell)上的克隆

docker - Docker 中的容器运行时在哪里执行?

azure - Azure 容器实例和容器 Web 应用程序有什么区别?

docker - 使用 pyodbc 将 docker python 连接到 SQL 服务器

docker容器无法使用 `service sshd restart`

linux - Shell - 将环境变量与 ccrypt 一起使用

shell - 谷歌应用引擎运行 Shell 脚本文件

amazon-web-services - `Authorization Token has expired` 在 MacOS Sierra 上发出 AWS-CLI

mysql 在运行 docker Composer - Node js 时出现错误

linux - shell 是否回显完整内容而不使用转义字符