Docker 容器中设置环境变量的方法

什么是 Docker 容器

Docker 是一种开源的容器化平台,它可以让开发者将应用程序和其依赖的库、标准化配置等封装到一个可移植的容器中,从而实现应用程序在不同平台和部署环境中的无缝移植。

Docker 容器是 Docker 平台的核心概念,它可以将应用程序和依赖的组件打包成一个运行时完整的环境,从而使得应用程序在不同的部署环境中具备高度的可移植性和一致性。

为什么要设置环境变量

在应用程序的开发、测试、部署的过程中,常常需要进行一些配置,例如数据库的连接信息、服务端口的设置等。这些配置信息通常会保存在应用程序中的配置文件中,然而这种方式有一个显著的缺点:当需要改变某个配置信息时,必须重新编译、打包、部署应用程序,这样会导致生产力的浪费和不必要的延迟,尤其是在现代云计算、容器化的环境下,应用程序的部署和维护变得更加频繁和复杂,因此更需要一种可动态修改的配置方案。

这时,环境变量就起到了重要的作用。通过将应用程序的配置信息存储在环境变量中,可以使得配置信息在容器创建、运行时自动注入到应用程序中,应用程序即可根据环境变量动态调整自身的行为,这增加了应用程序的灵活性和可维护性。

如何在 Docker 容器中设置环境变量

Docker 允许我们在容器中设置环境变量,从而可以将环境特定的配置信息传递给应用程序。Docker 容器中的环境变量分为两类:

  1. 系统中预定义的环境变量,例如 HOME、LANG、PATH 等;
  2. 用户自定义的环境变量,这是我们配置应用程序的主要方式。

在 Dockerfile 中,可以通过 ENV 指令来定义环境变量,例如:

--- ----------------
--- ------------------
--- ------------

然后,在容器运行时,这些变量可以被映射到容器中的环境变量中,例如:

------ --- ------ ----- -- ---------------- -- ---------------------- -------

这样,容器中的 myapp 应用程序就可以在运行时通过读取环境变量 PG_USER 和 PG_PASSWORD 来访问数据库了。

通过设置环境变量,我们可以将容器应用程序与其所需的配置信息分离开来,从而使得容器应用程序更加可移植和可配置。

示例代码

接下来,我们使用一个简单的 Node.js 应用程序作为示例,说明如何在 Docker 容器中设置环境变量。

首先,我们需要创建一个 Node.js 应用程序,假设我们有一个名为 hello.js 的文件,其内容如下:

----- ------- - -------------------
----- --- - ----------

----- ---- - ---------------- -- -----
----- -------- - -------------------- -- --------

------------ ----- ---- -- -
  ---------------------- ---------
---

---------------- -- -- -
  ------------------- ------- -- ---- ----------
---

该应用程序使用 express 框架创建一个 HTTP 服务器,当用户访问根路径时,会返回一个包含问候语的页面。其中,greeting 变量表示问候语,port 变量表示端口号,这两个变量的值取决于环境变量的设置。

然后,我们需要创建一个 Dockerfile 文件,将该应用程序打包成一个 Docker 镜像,其内容如下:

---- --------------

------- ----

---- ------------ ----
---- ----------------- ----

--- --- -------

---- -------- ----

--- ------------------
--- -----------

------ ----

--- ------- --------

该文件使用 node:14-alpine 镜像作为基础镜像,并在 /app 目录下创建一个 Node.js 应用程序的工作目录。然后,将 package.json 和 package-lock.json 文件复制到该工作目录下,并运行 npm install 命令以安装该应用程序的所有依赖项。最后,将 hello.js 文件复制到工作目录下,设置两个环境变量 GREETING 和 PORT,并将端口号 8080 映射到宿主机,最后通过 CMD 命令运行该应用程序。

最后,我们通过以下命令来构建和运行该 Docker 镜像:

------ ----- -- ----- -
------ --- -- --------- -- ---------------- -----

这样,我们就成功地将应用程序打包成一个 Docker 容器,并通过环境变量来指定应用程序的配置信息,使得应用程序具备了更高的灵活性和可维护性。

总结

通过使用环境变量,我们可以将应用程序的配置信息与应用程序代码分离开来,使得应用程序具备更高的灵活性和可维护性。在 Docker 容器中,我们可以通过 ENV 指令来定义环境变量,在容器运行时,也可以通过 -e 指令来动态设置环境变量。在实际应用中,我们可以根据业务需求设置不同的环境变量,从而实现不同环境下的自动配置,提高生产力和开发效率。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/648965b848841e98947aef8b


猜你喜欢

  • Kubernetes 中 Service、Label、Selector 的深入剖析

    Kubernetes 是一个开源的容器编排平台,它可以轻松地管理和部署容器化应用程序。Kubernetes 最大的特点是可以自动化地管理和部署容器,通过 Service、Label、Selector ...

    1 年前
  • Vue.js 设计模式解析 —— 组件间通信

    Vue.js 是一个流行的前端框架,它具有清晰简洁的 API 和良好的组件化架构。然而随着应用的复杂度增加,组件之间的通信也变得复杂和困难。本文将介绍 Vue.js 中的组件间通信设计模式,包括父子组...

    1 年前
  • 解决在浏览器中使用 ES12 中的 Array.includes 产生的错误

    在 ES12 版本中,Array 类型新增了一个 includes 方法,该方法用于判断数组中是否包含特定元素。这个方法在日常开发中十分实用,尤其是用于判断某个元素是否在数组中存在。

    1 年前
  • 在 PWA 中使用 IndexedDB 进行数据存储和管理

    在前端开发中,数据存储和管理是必不可少的一部分。传统的数据存储方式包括 Cookie, localStorage 等,但随着业务的复杂性增加,这些方式已经无法满足我们的需求。

    1 年前
  • 解决使用 Tailwind CSS 时在 Safari 中出现的兼容性问题

    问题的描述 Tailwind CSS 是一个非常流行的 CSS 框架,它能够大幅提高开发效率和代码复用性。然而,最近一些用户在使用 Tailwind CSS 时,在 Safari 中出现了一些兼容性问...

    1 年前
  • PM2 如何优雅重启 Node.js 应用

    PM2 是一款 Node.js 应用的进程管理工具,可以帮助我们方便地启动、停止、监控和重启 Node.js 应用。本文将介绍如何使用 PM2 实现优雅重启 Node.js 应用,以及详解重启机制,包...

    1 年前
  • 使用 ES7 中的 async / await

    ES7 中引入了 async / await,这是一种让异步编程更加简单和可读的方法。相比于传统的回调函数和 Promise,async / await 让代码更加直观和易于理解。

    1 年前
  • Cypress 自动化测试实践:如何与 Jenkins 集成

    随着前端技术的不断发展,自动化测试逐渐成为了前端工程师必备的技能之一。而在自动化测试方面,Cypress 可谓是一款优秀的前端自动化测试工具。Cypress 的出现让前端自动化测试变得更加简单、高效和...

    1 年前
  • Koa 中文件上传的实现方法

    引言 随着 Web 技术的快速发展,用户对于直接在页面中进行文件上传的需求越来越大。这时候,前端就需要在应用中集成文件上传功能。而在 Koa 中,文件上传功能的实现方法也就成了我们需要学习的一个重点。

    1 年前
  • React Native 中的图片优化

    React Native 是一款非常强大的跨平台移动应用开发框架,它可以让开发者用 JavaScript 和 React 的方式来构建 Android 和 iOS 应用。

    1 年前
  • CSS Flexbox 实现树形结构

    在前端开发中,经常需要实现树形结构的布局。而用传统的 CSS 规则实现树形结构会比较繁琐和复杂,难以实现响应式布局。但是,通过使用 CSS Flexbox,可以轻松地实现树形结构,且支持响应式布局。

    1 年前
  • Mongoose 中如何更新数组字段

    Mongoose 是一种 Node.js 框架,用于对 MongoDB 数据库进行操作。在 Mongoose 中,可以方便地更新数组类型的字段。以下是本文所涉及的主题: 如何在 Mongoose 中...

    1 年前
  • Redis 在实时消息推送中的应用

    简介 Redis 是一种高性能的、非关系型的 key-value 数据库。由于它的速度快、易于使用,因此在互联网应用中得到了广泛的应用。其中,Redis 在实时消息推送中的应用非常广泛,下面我们就来详...

    1 年前
  • Socket.io 如何实现消息加密传输

    随着互联网的迅速发展,安全性问题日益凸显,消息加密成为了网络传输中不可或缺的一环。Socket.io 是一个流行的实时应用程序框架,能够在服务器和客户机之间建立实时的双向通信。

    1 年前
  • Web Components 如何更改父组件的属性

    前言 在 Web 开发过程中,开发者经常需要创建复杂的 UI 组件和自定义控件。为了提高组件的可复用性和灵活性,我们可以使用 Web Components 技术。Web Components 是一种模...

    1 年前
  • RESTful API 设计中如何使用自定义 Content-Type

    什么是 RESTful API REST(Representational State Transfer)是一种架构风格,它主要是基于 HTTP 的,使用最广泛的 Web API 设计标准之一。

    1 年前
  • ECMAScript 2019 的 Promise.all():如何避免同步异步操作误区

    在 Web 开发中,经常会涉及同时执行多个异步操作的场景。比如同时获取多个数据源,等待所有的数据源返回结果后再处理结果。在过去,常常通过使用回调、事件监听等方式来实现;而在 ES6 中引入的 Prom...

    1 年前
  • ES6 的 yield 和 generator 让异步编码更加优雅

    在传统 JavaScript 中,一个函数的执行是连续的,如果其中某个任务比较耗时,那么整个程序会被阻塞,导致用户体验变得很差。 为了解决这个问题,ES6 引入了 yield 关键字和 generat...

    1 年前
  • 基于 ES9 的 Rest/Spread 属性的深度剖析

    在最新的 EcmaScript 9 中,我们可以使用 Rest/Spread 属性来极大地简化我们的前端开发工作。Rest/Spread 属性可以让我们轻松地处理数组/对象,像是传递参数、合并数组/对...

    1 年前
  • Promise 最常见的错误使用案例及解决方案

    前言 前端开发中,Promise 是一项非常重要的技术。使用 Promise,可以更好地控制异步操作的执行顺序。然而,由于 Promise 的语法比较复杂,所以在使用中难免会出错,本文将介绍 Prom...

    1 年前

相关推荐

    暂无文章