代码之家  ›  专栏  ›  技术社区  ›  k0pernikus

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

  •  8
  • k0pernikus  · 技术社区  · 8 年前

    给定此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变量,但它们都是空的。这个 --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处于同一级别。

    env文件是有效的,我可以在本地计算机上获取它并访问那里的变量。

    我的错在哪里?

    1 回复  |  直到 7 年前
        1
  •  14
  •   k0pernikus    4 年前

    请记住 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
    

    将按预期导入环境变量。

    推荐文章