Docker 环境变量无法通过运行命令传递到 shell 脚本

Dea*_*ler 8 docker

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

如何在 ENTRYPOINT 数组中使用 Docker 环境变量?

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

#!/bin/bash
#IF ANY command fails, fail the script
set -e
echo "Deploying $@"
Run Code Online (Sandbox Code Playgroud)

这是我的 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}"
Run Code Online (Sandbox Code Playgroud)

这是我的 docker run 命令,我尝试在其中提供服务。(如果也没有提供服务,我宁愿失败)

docker run gcr.io/orderly-gcp/prod-deploy -e SERVICE=blah
Run Code Online (Sandbox Code Playgroud)

然而,当我运行该命令时,我的输出很简单

Deploying default
Run Code Online (Sandbox Code Playgroud)

我不确定为什么我遵循了该示例 SO 帖子,但这仍然不起作用?

Ahm*_*lly 5

向docker传递环境变量有3种方式


第一种方式

使用-e像这样的标志-e ENV_NAME='ENV_VALUE'

具有一个环境变量的示例

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD='secret' -d mysql:tag
Run Code Online (Sandbox Code Playgroud)

具有两个环境变量的示例

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD='secret' -e MYSQL_DATABASE='mySchema' -d mysql:tag
Run Code Online (Sandbox Code Playgroud)

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

docker run --name some-mysql -d -t -i -e MYSQL_ROOT_PASSWORD='secret' -e MYSQL_DATABASE='mySchema' mysql:tag
Run Code Online (Sandbox Code Playgroud)

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


第二种方式

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

具有一个环境变量的示例

创建.env文件

MYSQL_ROOT_PASSWORD=secret
Run Code Online (Sandbox Code Playgroud)

然后在docker命令中使用

docker run --name some-mysql --env-file ./.env -d mysql:tag
Run Code Online (Sandbox Code Playgroud)

具有两个环境变量的示例

创建.env文件

MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=mySchema
Run Code Online (Sandbox Code Playgroud)

然后在docker命令中使用

docker run --name some-mysql --env-file ./.env -d mysql:tag
Run Code Online (Sandbox Code Playgroud)

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

MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=mySchema
Run Code Online (Sandbox Code Playgroud)

然后在docker命令中使用

docker run --name some-mysql -d -t -i --env-file ./.env mysql:tag
Run Code Online (Sandbox Code Playgroud)

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

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


第三条路

使用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'
Run Code Online (Sandbox Code Playgroud)

然后尝试使用printenv MY_NAME结果将其打印ahmed

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

具有一个环境变量的示例

export MYSQL_ROOT_PASSWORD='secret'
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD -d mysql:tag
Run Code Online (Sandbox Code Playgroud)

具有两个环境变量的示例

export MYSQL_ROOT_PASSWORD='secret'
export MYSQL_DATABASE='mySchema'
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD -e MYSQL_DATABASE -d mysql:tag
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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


演示

Dockerfile

FROM debian

ENTRYPOINT ["printenv", "ENV_NAME"]
Run Code Online (Sandbox Code Playgroud)

尝试使用它

$ 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
Run Code Online (Sandbox Code Playgroud)