【问题标题】:Docker environment variable not making it through on run command to shell scriptDocker 环境变量在运行命令时无法通过 shell 脚本
【发布时间】:2020-07-23 21:10:53
【问题描述】:

我正在尝试完全按照这里的答案来做

How do I use Docker environment variable in ENTRYPOINT array?

但由于某种原因,它不起作用,这是我的 deploy.sh 脚本..

#!/bin/bash
#IF ANY command fails, fail the script
set -e
echo "Deploying $@"

这是我的 Docker 文件

FROM gcr.io/google.com/cloudsdktool/cloud-sdk:alpine
ENV SERVICE="default"
RUN mkdir -p ./monobuild
COPY . ./monobuild/
WORKDIR "/monobuild"
ENTRYPOINT ./deploy.sh "${SERVICE}"

这是我尝试输入 SERVICE 的 docker run 命令。 (如果没有提供服务,我宁愿失败)

docker run gcr.io/orderly-gcp/prod-deploy -e SERVICE=blah

但是,当我运行该命令时,我的输出只是

Deploying default

我不确定为什么我遵循该示例 SO 帖子,但仍然无法正常工作?

【问题讨论】:

  • 这是什么操作系统? Linux?
  • 不应该有-edocker run之后像这样docker run -e SERVICE=blah gcr.io/orderly-gcp/prod-deploy吗?

标签: docker


【解决方案1】:

将环境变量传递给docker的三种方式


第一种方式

使用-e 标志,如-e ENV_NAME='ENV_VALUE'

一个环境变量的示例

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD='secret' -d mysql:tag

两个环境变量的示例

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD='secret' -e MYSQL_DATABASE='mySchema' -d mysql:tag

具有两个环境变量和许多选项的示例

docker run --name some-mysql -d -t -i -e MYSQL_ROOT_PASSWORD='secret' -e MYSQL_DATABASE='mySchema' mysql:tag

注意:您应该在 -e MYSQL_ROOT_PASSWORD='secret' -e MYSQL_DATABASE='mySchema' 等选项之后传递图像名称 mysql:tag


第二种方式

使用.env 文件。基本上你会将环境变量添加到.env 文件,然后将此名称传递给docker run 命令,如docker run --env-file ./.env

一个环境变量的示例

创建.env 文件

MYSQL_ROOT_PASSWORD=secret

然后在docker命令中使用

docker run --name some-mysql --env-file ./.env -d mysql:tag

两个环境变量的示例

创建.env 文件

MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=mySchema

然后在docker命令中使用

docker run --name some-mysql --env-file ./.env -d mysql:tag

具有两个环境变量和许多选项的示例 创建.env文件

MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=mySchema

然后在docker命令中使用

docker run --name some-mysql -d -t -i --env-file ./.env mysql:tag

注意:您不应在值中添加单引号或双引号

注意:您应该在 --env-file ./.env 等选项之后传递图像名称 mysql:tag


第三条路

使用linux环境变量所以首先我们需要解释如何添加linux环境变量。它有两种类型(本地,全局)。例如-e ENV_NAME

  • 本地(每个终端)

要添加本地环境变量,只需使用$ export MY_NAME='ahmed'。然后尝试检索它$ printenv MY_NAME,结果将是ahmed

注意:当您使用$ export MY_NAME='ahmed' 时,您可以在当前终端的任何命令中使用MY_NAME。因此,如果您尝试在另一个终端中使用它,它将无法正常工作。

  • 本地(每个命令)

要添加环境变量以在当前命令中工作,只需使用$ MY_NAME='ahmed' my_command。例如$ MY_NAME='ahmed' printenv MY_NAME 结果将是ahmed。因此,如果您再次尝试打印MY_NAME,它将无法正常工作。

  • 全球(适用于所有终端)

要添加环境变量以在所有终端中工作,只需打开 ~/.bashrc 然后添加您的环境变量,如

MY_NAME='ahmed'
ENV_NAME='ENV_VALUE'

然后尝试使用printenv MY_NAME 打印它,结果将是ahmed

让我们按照示例进行操作。

一个环境变量的示例

export MYSQL_ROOT_PASSWORD='secret'
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD -d mysql:tag

两个环境变量的示例

export MYSQL_ROOT_PASSWORD='secret'
export MYSQL_DATABASE='mySchema'
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD -e MYSQL_DATABASE -d mysql:tag

具有两个环境变量和许多选项的示例

export MYSQL_ROOT_PASSWORD='secret'
export MYSQL_DATABASE='mySchema'
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD -e MYSQL_DATABASE -d -t -i mysql:tag

注意:您应该在 -e MYSQL_ROOT_PASSWORD -e MYSQL_DATABASE 等选项之后传递图像名称 mysql:tag


演示

Dockerfile

FROM debian

ENTRYPOINT ["printenv", "ENV_NAME"]

尝试使用它

$ docker build --tag demo .

$ ENV_NAME='Hello World' docker run -e ENV_NAME demo:latest
$ Hello World

$ docker run -e ENV_NAME='Hello World' demo:latest
$ Hello World

【讨论】:

    【解决方案2】:

    我认为问题在于您的 docker run 调用。应该是这样的:

    docker run -e SERVICE=blah gcr.io/orderly-gcp/prod-deploy 
    

    来自documentation

    docker run 的命令行参数将附加在后面 exec 形式 ENTRYPOINT 中的所有元素,并将覆盖所有元素 使用 CMD 指定的元素。这允许将参数传递给 入口点,即 docker run -d 将传递 -d 参数 到入口点。您可以使用覆盖 ENTRYPOINT 指令 docker run --entrypoint 标志。

    【讨论】:

      【解决方案3】:

      您使用run 命令的方式导致了问题。

      -e 是一个选项,该命令的使用方式是

      docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
      

      表示-e 在图片名称之前

      【讨论】:

        猜你喜欢
        • 2020-12-02
        • 2013-08-08
        • 1970-01-01
        • 2012-03-27
        • 2016-12-23
        • 1970-01-01
        • 2022-08-16
        • 1970-01-01
        • 2015-04-19
        相关资源
        最近更新 更多