【问题标题】:Global environment variables in a shell script with Dockerfile带有 Dockerfile 的 shell 脚本中的全局环境变量
【发布时间】:2022-01-03 16:57:50
【问题描述】:

我正在尝试使用 Dockerfile 在 Python 映像中创建一个名为 SETTINGS 的 ENV VAR。这个环境变量必须是动态的,因为我需要在生产和预生产之间更改配置文件。

我创建了一个包含两个命令的脚本 (entrypoint.sh),第一个创建 SETTINGS VAR,第二个是 python 命令。

问题是 python 行可以正常工作,但 SETTINGS var 不能。

脚本

#!/bin/bash
profile=$profile
export SETTINGS=/acalls-service/${profile}.cfg
python -m "_acalls_clasiffier" 
exec

Dockerfile

ENTRYPOINT ["/bin/bash", "-c", ". entrypoint.sh"]

我也尝试过 ["./entrypoint.sh] 但我不工作。

【问题讨论】:

  • 你能分享更多关于“设置变量没有”的意思吗?你能用 hello-world 风格的脚本替换_acalls_clasiffier,它打印环境变量并向我们展示实际输出和你的期望吗?有关您如何运行以及如何设置 env var 的更多信息也很高兴。

标签: bash docker dockerfile sh script


【解决方案1】:

docker build 上传递dynamic 环境变量或在运行时传递变量是有区别的。

运行时的环境变量

如果你想在运行时传递它,它不需要在你的 Dockerfile 中,只需在运行容器时传递它:

docker run my-image -e MY_ENV=foo

构建时的环境变量

在构建期间,您必须:

  • 在 Dockerfile 中定义环境变量
  • 将环境变量传递到构建过程中

示例 Dockerfile:

  ARG MY_BUILD_ARG=myDefaultArgument

  FROM node:16.9.0

  ARG MY_BUILD_ARG

  ENV MY_PUBLIC_ENV=${MY_BUILD_ARG}

  RUN echo ${MY_PUBLIC_ENV} // => myRandomEnvVar

然后在构建时传递它为:

docker build --build-arg MY_BUILD_ARG=myRandomEnvVar

【讨论】:

    【解决方案2】:

    这将是入口点包装脚本的典型用法。请记住,容器只运行一个进程。如果您的 Dockerfile 指定了 ENTRYPOINT,那就是过程,并且 CMD 作为附加参数传递给它。这使您可以设置一个脚本,该脚本执行一些首次设置,然后将其自身替换为实际命令:

    #!/bin/sh
    
    # Set the environment variable
    export SETTINGS=/acalls-service/${profile}.cfg
    
    # Run the CMD
    exec "$@"
    

    在您的 Dockerfile 中,您可以将此脚本指定为 ENTRYPOINT,然后将实际命令指定为 CMD

    ENTRYPOINT ["./entrypoint.sh"]             # must be JSON-array syntax
    CMD ["python", "-m", "_acalls_clasiffier"] # shell syntax allowed here too
    

    由于您可以轻松提供替换 CMD,因此您可以检查它是否有效

    docker run --rm myimage \
      sh -c 'echo $SETTINGS'  # <-- run in the container, single-quoted so the
                              #     host shell doesn't expand it
    

    如果您在带有docker exec 的容器中获得调试shell,它将看不到变量集,因为它没有通过入口点序列运行。这通常不是一个实际问题。您始终可以docker run 一个带有交互式 shell 而不是 Python 脚本的新容器。

    【讨论】:

    • 同样的问题。 Python 命令工作正常,但未创建 SETTINGS 变量
    • 你为什么这么认为?例如,如果您的 Python 脚本查看 os.environ['SETTINGS'],我希望它设置正确。
    • 如果我在 python cli 中使用“set”或 echo $SETTINGS 命令,SETTINGS var 不会像其他 env vars 那样显示
    • 如何获得“python CLI”; CMD 这里应该启动一个特定的程序?正如我在上一段中提到的,在您需要使用docker exec 调试容器的异常事件中,该变量将不可见。
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2023-04-04
    • 2013-09-04
    相关资源
    最近更新 更多