在 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 指令设置的环境变量。
相关文章
Get the IP address of the Docker container from the host using docker inspect
发布时间:2025/03/26 浏览次数:102 分类:Docker
-
Docker containers are not just for isolation—they are often used to manage processes that still need to communicate directly with each other. However, to communicate, you usually need to know the IP address of each container, which you ca
Solution to incorrect access log time when deploying Nginx in Docker
发布时间:2025/03/26 浏览次数:165 分类:Docker
-
In the process of operating the website, I never took the logs too seriously. Although logging was turned on, I never analyzed the logs carefully. Today, when I looked at the logs on a whim, I found that the recorded time was 8 hours less t
Docker deploys nginx php application
发布时间:2025/03/26 浏览次数:131 分类:Docker
-
I'm learning docker recently. I'm learning by building an nginx+php development environment example. Here I record the build process. First, give a docker-compose.yml deployment configuration file version: '3' services: nginx: container_nam
How to use Docker to image a Node.js web application
发布时间:2025/03/26 浏览次数:107 分类:Docker
-
Docker is a containerization platform that simplifies the packaging and execution of applications. Containers run as independent processes with their own file systems, but share the kernel of their host machine. Docker has attracted much at
Start a Bash terminal in a new Docker container
发布时间:2025/03/26 浏览次数:97 分类:Docker
-
Docker containers are a standard unit for packaging all the dependencies of an application, allowing us to easily run them in any environment. Containers have become very popular recently, and most developers now rely heavily on containers
Passing environment variables to containers in Docker
发布时间:2025/03/26 浏览次数:124 分类:Docker
-
This article will introduce how to pass environment variables to containers in Docker. Passing environment variables to containers in Docker using the -e and tags -env We will first see how to create environment variables and pass them to t
Install Docker using Homebrew
发布时间:2025/03/26 浏览次数:202 分类:Docker
-
There is no doubt that Docker containers have revolutionized the way we develop and deploy applications. They provide developers with the ability to package applications and dependencies in an isolated environment. Recently, we've seen wide
Enforce clean build of images in Docker
发布时间:2025/03/26 浏览次数:87 分类:Docker
-
This article discusses and demonstrates how to enforce clean builds of images in Docker. Building images in Docker We will use a simple Flask application to demonstrate this concept. my-app Create a app.py simple application named in the ho
Running a Docker instance from a Dockerfile
发布时间:2025/03/26 浏览次数:140 分类:Docker
-
Docker containers have undoubtedly become the standard unit for managing software and dependencies in different environments. When using real applications, you must create a docker file before building the container image of the application