在 Docker 中设置环境变量
环境变量用于添加额外的配置或元数据以帮助开发应用程序,并且可以以不同的形式存在。
例如,在开发Java应用程序时,我们通常会设置一个指向Java开发包位置的环境变量,以保证我们可以编译运行我们的应用程序。
同样,我们可以在使用 Docker 开发我们的应用程序时为我们的容器设置环境变量。 在本教程中,我们将学习如何设置 ENV 变量以及如何在必要时从正在运行的容器访问变量。
创建一个新项目
打开 WebStorm IDEA 并选择文件 > 新建 > 项目。 在打开的窗口中,选择 Node.js 并将项目名称从无标题更改为 docker-env-variables 或使用任何首选名称。
确保您已经安装了 Node 运行时环境,以便可以从计算机自动添加 Node 解释器和包管理器部分。 最后,按标有创建的按钮生成项目。
由于我们的应用程序使用 expressjs,因此请使用以下命令将 expressjs 安装到我们的应用程序中。
~/WebstormProjects/docker-env-variables$ npm install express
安装 expressjs 后,在 docker-env-variables 文件夹中创建一个名为 index.js 的文件,并将以下代码复制并粘贴到该文件中。
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.json(
[{
name: 'Lenovo Legion 5 pro',
type: 'electronic',
price: 1500
},
{
name: 'Xiaomi pro 14',
type: 'electronic',
price: 1300
},
])
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
在此文件中,我们模拟了一个在电子商务环境中返回产品数组的应用程序,我们将使用此应用程序来测试本教程中涵盖的示例。
创建一个 Dockerfile
在文件夹 docker-env-variables 中创建一个名为 Dockerfile 的文件。 Dockerfile 是一个帮助我们定义自定义镜像配置的文件。
我们可以使用两种方法来设置环境变量:ARG 指令和 ENV 指令。
这两条指令之间的区别在于,正在运行的容器无法访问使用 ARG 指令设置的环境变量,因为它们仅在构建图像时可用。 以下部分展示了如何使用这些指令来实现我们的目标。
使用 ARG 指令设置环境变量
将以下说明复制并粘贴到我们在上一节中创建的名为 Dockerfile 的文件中。
FROM node:16.17.0-alpine
ARG APP_NAME
ARG APP_VERSION=1.0.0
RUN echo "build an image of ${APP_NAME} version ${APP_VERSION}"
WORKDIR /com/ecommerce
ADD package*.json ./
RUN npm install
COPY . .
CMD node index.js
FROM 指令设置我们的基础图像,在其上创建我们的自定义图像。 在我们的例子中,我们使用了 alpine,它提取了 Node.js 的轻量级版本。
ARG 定义了 Docker 构建器可用于构建映像的变量。 使用此指令提供的变量可以是必需的或可选的。
Docker 文档提供了一个参考,我们可以在其中阅读其他说明。
在我们的例子中,我们提供了一个名为 APP_NAME 的可选变量和一个名为 APP_VERSION 的必需变量。
请注意
,这些变量仅在构建图像时可用。 下一节将对此进行验证。
创建镜像
使用下面的命令构建带有标签 docker-env:latest 的镜像。
~/WebstormProjects/docker-env-variables$ docker build --tag docker-env:latest .
该命令顺序执行我们的Dockerfile,我们可以查看每一步执行情况,如下。
=> [1/6] FROM docker.io/library/node:16.17.0-alpine@sha256:2c405ed42fc0fd6aacbe5730042640450e5ec030bada7617beac88f742b6 0.0s
=> CACHED [2/6] RUN echo "build an image of ${APP_NAME} version 1.0.0" 0.0s
=> [3/6] WORKDIR /com/ecommerce 0.6s
=> [4/6] ADD package*.json ./ 0.8s
=> [5/6] RUN npm install 6.7s
=> [6/6] COPY . .
在构建镜像时,我们可以提供空环境变量的值或使用 --build-arg 命令覆盖默认环境值,如下所示。
~/WebstormProjects/docker-env-variables$ docker build --build-arg APP_NAME=ecommerce-app --tag docker-env:latest .
运行容器
使用以下命令运行一个名为 docker-env-prod 的容器,该容器在主机上公开端口 3000。
~/WebstormProjects/docker-env-variables$ docker run --name docker-env-prod -d -p 3000:3000 docker-env:latest
此命令运行我们应用程序的一个实例,我们可以在浏览器上通过 localhost:3000 (http://localhost:3000/) 访问它。 但是,我们的目标是检查是否可以使用 ARG 指令访问环境变量集。
要检查这一点,请使用以下命令以交互模式访问我们的容器文件系统。
~/WebstormProjects/docker-env-variables$ docker exec -it docker-env-prod /bin/sh
输出:
/com/ecommerce #
要显示当前的环境变量,请使用下面的命令,注意我们使用 ARG 指令设置的两个变量并没有显示出来。
/com/ecommerce # printenv
输出:
NODE_VERSION=16.17.0
HOSTNAME=1bbf5ec4141e
YARN_VERSION=1.22.19
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/com/ecommerce
使用 ENV 指令设置环境变量
将之前Dockerfile中的Docker指令做成注释,将下面的指令复制粘贴到注释后的文件中。
FROM node:16.17.0-alpine
ENV APP_NAME=ecommerce-app
ENV APP_VERSION=1.0.0
RUN echo "build an image of ${APP_NAME} version ${APP_VERSION}"
WORKDIR /com/ecommerce
ADD package*.json ./
RUN npm install
COPY . .
CMD node index.js
这个 Dockerfile 中的指令与之前的相同,我们所做的唯一更改是将 ARG 指令替换为 ENV 指令。
ENV 设置 Docker 构建器可用于创建映像的环境变量。 环境变量采用键值对的形式。
请注意
,这些变量不是可选的,并且声明的每个值都必须具有与先前允许可选变量的指令相比的值。
由于前面的示例说明了如何从中创建和运行容器,因此在此示例中使用相同的方法来实现相同的目的。 使用 ENV 指令,我们可以访问我们的两个环境变量,APP_NAME 和 APP_VERSION,如下所示。
NODE_VERSION=16.17.0
HOSTNAME=0cca1ee1340d
YARN_VERSION=1.22.19
SHLVL=1
HOME=/root
APP_NAME=ecommerce-app
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/com/ecommerce
APP_VERSION=1.0.0
动态设置环境变量
在命令行上构建图像时,我们可以使用 ARG 指令为使用 ENV 指令定义的变量动态赋值。
要实际查看此操作,请将 Dockerfile 中的先前指令作为注释并将以下指令复制并粘贴到文件中。
FROM node:16.17.0-alpine
ARG HOST_MACHINE
ENV APP_NAME=ecommerce-app
ENV APP_VERSION=1.0.0
ENV DEV_ENV=$HOST_MACHINE
RUN echo "build an image of ${APP_NAME} version ${APP_VERSION}"
WORKDIR /com/ecommerce
ADD package*.json ./
RUN npm install
COPY . .
CMD node index.js
请注意
,我们添加了一个带有名为 HOST_MACHINE 的变量的 ARG 指令,该指令通过引用变量名称 $HOST_MACHINE 动态分配给具有变量名称 DEV_ENV 的 ENV 指令。
我们可以为变量名 HOST_MACHINE 创建一个默认值,它也将分配给 DEV_ENV 变量,或者在命令行上使用 --build-arg 命令为 HOST_MACHINE 赋值,我们将得到相同的结果。
总结
在本教程中,我们学习了如何设置环境变量以及如何从正在运行的容器中访问这些变量。 我们已经学习了如何使用 ARG 指令、ENV 指令以及如何动态设置环境变量。
从这里要注意的要点是,无法从正在运行的容器访问使用 ARG 指令设置的环境变量。
相关文章
在 Linux 中托管 Docker Internal
发布时间:2023/04/18 浏览次数:139 分类:Docker
-
Docker 允许开发人员通过将应用程序包装在称为容器的标准化单元中来高效地构建、测试和部署应用程序。 在使用 Docker 容器时,您可能会遇到需要将容器与主机连接的场景。
在 Docker 中设置工作目录
发布时间:2023/04/18 浏览次数:82 分类:Docker
-
在 Docker 中,我们可以通过编辑 Dockerfile 并添加密钥 WORKDIR 来设置我们的工作目录。本文将讨论在 Docker 中更改我们当前和默认的工作目录。
在 Docker 容器中公开多个端口
发布时间:2023/04/18 浏览次数:143 分类:Docker
-
Docker 容器使用端口来实现万维网上不同设备之间的通信。 在本篇文章中,我们将学习如何使用 Nginx 应用程序在 Docker 容器中公开多个端口。
将用户添加到 Docker 容器
发布时间:2023/04/18 浏览次数:187 分类:Docker
-
在本文中,我们将学习如何通过实现返回产品数组的 Express 应用程序将用户添加到 Docker 容器。
使用 Docker 网络主机命令
发布时间:2023/04/18 浏览次数:112 分类:Docker
-
在本文中,我们将学习如何使用 --network 命令将容器添加到主机网络。 如果我们不使用此命令指定网络,我们还将了解如何将容器添加到默认网络。
清除 Docker 容器日志
发布时间:2023/04/18 浏览次数:181 分类:Docker
-
本文介绍了我们可以用来清除 docker 容器中日志的不同方法。日志是应用程序在特定事件或状态发生时记录的信息,它们帮助我们监控应用程序并采取必要的措施。
Dockerfile 中 COPY 和 ADD 命令的区别
发布时间:2023/04/18 浏览次数:158 分类:Docker
-
在 Dockerfile 中,我们可以使用 COPY 或 ADD 命令复制这些文件。 这些命令在功能上是相同的; 但是,存在一些差异。本文介绍了 Dockerfile 中 COPY 和 ADD 命令之间的区别。