独立开发经验谈:我是如何借助 Docker 环境变量让客户 1 分钟上线客服系统的

news/2025/2/5 18:57:01/文章来源:https://www.cnblogs.com/sheng_chao/p/18699999

我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营一款独立产品的经验。

我之前写过一篇文章,介绍如何用 Docker 让潜在客户快速体验你的独立产品。

有朋友看到这篇文章之后,试用了产品并且给了我新的建议:用 Docker 环境变量让试用更方便。在此感谢这位 xj 的朋友。

我的例子

在前一篇文章中,要运行我制作的在线客服系统 Docker 镜像为例,需要 2 个命令:

  1. 从 Docker Hub 下载升讯威在线客服系统镜像
    docker pull iccb1013/linkup:latest

  2. 启动容器(之前的命令)
    docker run -p 8021-8023:8021-8023 -p 9527:9527 -dit --restart=always --privileged=true --name=linkup_latest iccb1013/linkup:latest

但是在启动容器之后,还有一个步骤需要手工操作,就是查看容器的 Id,并进入容器内部去修改配置文件,修改 kf-api、kf-resource 两个域名和 IP 地址,这一步虽说不算麻烦,但毕竟要进入容器内部再用 vim 去操作。

这位 xj 的朋友给了我一个建议,用环境变量,使用环境变量之后启动命令看起来长这样:

docker run -e ApiUrl=http://kf-api.yourname.com -e ResourceUrl=http://kf-resource.yourname.com -e TcpIpAddress=您的服务器公网IP地址 -p 8021-8023:8021-8023 -p 9527:9527 -dit --restart=always --privileged=true --name=linkup_latest iccb1013/linkup:latest

在新的启动命令中,包括了 3 个环境变量,分别是:

  • ApiUrl:您的主程序域名
  • ResourceUrl:静态资源站点域名
  • TcpIpAddress:您的服务器公网IP地址
    通过指定这些环境变量,可以在启动容器后直接上线使用,而无需进入容器手工修改配置文件。

这样就可以将这 3 个主要参数带进容器内部,自动写入配置文件中,完全免去了进入容器内部 vim 修改的步骤,接下来只需要在宿主机 Nginx 中配上站点,把请求代理到容器上就完事儿了,真真正正做到了在线客服系统 1 分钟上线。

重点来了,如何让你的独立产品用上 Docker 环境变量

Docker环境变量是 Docker 容器化应用中一种重要的配置方式。它们可以帮助在容器启动时为应用提供必要的参数或配置,而不需要修改容器内部的代码或配置文件。Docker 环境变量使得容器可以更加灵活和动态化,尤其在不同的部署环境中尤为重要。

1. 什么是 Docker 环境变量?

Docker 环境变量(Environment Variables)是操作系统层面上用于存储配置信息的变量。在 Docker 容器中,环境变量通常用于存储应用的配置信息、凭证、API 密钥、数据库连接字符串等。它们可以在容器启动时传递,并可以在运行时访问和修改。

2. 为什么使用环境变量?

  • 灵活性:可以根据不同的运行环境提供不同的值,无需修改容器镜像。
  • 安全性:可以避免硬编码敏感信息(如密码、API 密钥等),提升安全性。
  • 配置管理:通过环境变量可以在不修改容器内容的情况下,动态调整容器行为。

3. 如何在 Docker 中使用环境变量?

Docker 提供了几种设置和使用环境变量的方式:

3.1 使用 -e--env 参数设置环境变量

在使用 docker run 启动容器时,可以通过 -e 参数来设置环境变量。例如:

docker run -e MY_ENV_VAR=value my_image

这样会在容器中设置一个名为 MY_ENV_VAR 的环境变量,值为 value

3.2 使用 .env 文件

为了方便管理多个环境变量,可以使用 .env 文件。在 .env 文件中,每一行定义一个环境变量的键值对:

MY_ENV_VAR=value
ANOTHER_ENV_VAR=another_value

然后通过 --env-file 参数将该文件传递给 Docker 容器:

docker run --env-file .env my_image

3.3 在 Dockerfile 中使用 ENV 指令

在构建镜像时,可以在 Dockerfile 中使用 ENV 指令来设置环境变量:

FROM ubuntu:latest
ENV MY_ENV_VAR=value

这将创建一个在容器运行时可用的环境变量 MY_ENV_VAR

3.4 使用 docker-compose 中的环境变量

在使用 docker-compose 管理多个容器时,可以在 docker-compose.yml 文件中定义环境变量:

version: '3'
services:webapp:image: my_imageenvironment:- MY_ENV_VAR=value- ANOTHER_VAR=another_value

此外,也可以从 .env 文件加载环境变量:

version: '3'
services:webapp:image: my_imageenv_file:- .env

3.5 通过 docker exec 查看环境变量

可以通过 docker exec 进入容器内部,使用 envprintenv 命令查看容器中的环境变量:

docker exec -it container_id env

4. 环境变量的作用与实践

环境变量通常用于以下几种场景:

4.1 数据库连接信息

在多环境部署中,数据库连接信息可以通过环境变量配置,以避免在源代码中硬编码这些信息。例如:

docker run -e DB_HOST=localhost -e DB_USER=root -e DB_PASS=secret my_image

4.2 API 密钥

很多应用依赖于外部服务的 API 密钥,这些密钥可以通过环境变量来传递,以避免泄露。例如:

docker run -e API_KEY=your_api_key my_image

4.3 配置不同的运行环境

可以根据不同的环境传递不同的环境变量值,如开发、测试和生产环境。例如,在生产环境中你可能需要开启调试日志,但在开发环境中关闭它。

docker run -e ENV=production -e LOG_LEVEL=error my_image

5. 容器间共享环境变量

在多容器的场景中,如果需要多个容器共享环境变量,可以通过 Docker 网络和服务间的环境变量传递来实现。例如,使用 Docker Compose 启动多个服务时,web 服务可以访问 db 服务的环境变量。

6. 限制和注意事项

  • 敏感信息:环境变量可以在 Docker 容器启动时传递,但它们也有泄露的风险。例如,容器日志或操作系统的某些工具可能会暴露这些变量。
  • 变量覆盖:在容器运行时,环境变量的值可能会被外部传递的变量覆盖。例如,在 docker-compose.yml 中设置的环境变量可以在 docker run 时通过 -e 参数覆盖。
  • 共享变量的作用域:在 Docker Compose 或多容器应用中,环境变量的作用域仅限于指定的容器,跨容器传递时需要显式声明。

钟意的话请给个赞支持一下吧,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879205.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线段树详解

授人以鱼不如授人以渔本文尽量详细地讲述线段树的引入,实现,应用,以及相关进阶知识。 引入 引入线段树通用的例子: 给定一组整数\(nums\),定义两种操作修改列表里的第\(i\)个数据为\(val\) ①查询区间和\([L,R]\) ②为了同时实现两种操作,现在考虑处理\(nums\)的方式 简单…

[Python] 依赖注入的使用,多模块任务隔离

使用google/pinject(依赖注入库)搭建了一个多模块运行、相互隔绝的项目。定义全局单例的依赖注入容器:"""依赖注入容器"""from typing import Any, List, Type, TypeVar import pinject import pinject.findingclass Ioc:"""依…

关于设计模式的一点想法

《设计模式:可复用面向对象软件的基础》书评最早读这本《设计模式:可复用面向对象软件的基础》是在大学的时候。读了一些片段,看到了讲文本编辑器的滚动条装饰,觉得有点意思,可以用来做图形界面。记得有一天晚上上床睡觉后,和两位同寝室室友聊天。一位室友LL说,他为了找…

ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明

容器存储是容器应用运行时的数据保障,本次 ACK 容器存储监控的更新能够帮助用户全面、精细地掌控集群中的存储细节,快速定位业务运行过程中可能出现的 IO 瓶颈和 IO 问题,更好地保证业务的平稳运行。作者:邱圆辉(霜序) 背景 随着容器化应用的日益普及、业务规模的增长以及…

LLM大模型:deepseek浅度解析(三):R1的reinforcement learning复现

deepseek-R1比较创新的点就是reward函数了,其自创的GRPO方法,详解如下:https://www.cnblogs.com/theseventhson/p/18696408训练出了R1-zero和R1两个强化学习版本!幸运的是,GRPO的这个算法已经有人实现,并集成到huggingface啦,直接调用就行,demo在这里:https://gist.gi…

并发编程 - 线程同步(三)之原子操作Interlocked简介

原子操作是不可分割的操作单元,Interlocked提供硬件级别原子操作,比传统锁机制效率高。Interlocked支持多种原子操作,如增减、替换、位操作等,确保多线程安全。上一章我们了解了3种处理多线程中共享资源安全的方法,今天我们将更近一步,学习一种针对简单线程同步场景的解决…

从易用性到高级分析:五款优秀报表软件盘点

本文将为大家介绍五款报表软件,详细描述它们的功能亮点和适用场景。山海鲸报表、Qlik Sense、Looker、Domo和Power BI分别在自助分析、实时数据访问、数据整合、可视化以及人工智能支持等方面展现了强大的功能。这些软件适用于不同规模的企业,能够帮助企业实现数据的可视化、…

阿里云可观测 2024 年 12 月产品动态

阿里云可观测 2024 年 12 月产品动态

pre-norm、post-norm

同一设置之下,Pre Norm结构往往更容易训练,但最终效果通常不如Post Norm参考资料 苏剑林. (Mar. 29, 2022). 《为什么Pre Norm的效果不如Post Norm? 》[Blog post]. Retrieved from https://kexue.fm/archives/9009为什么大模型结构设计中往往使用postNorm而不用preNorm?

连接VNC时出现attempting to reconnect to vnc server

参考 https://blog.csdn.net/weixin_46031767/article/details/128076399 使用VNC View连接kvm虚拟机无法出现画面提示 Attempting to reconnect to VNc Server.. Protocol error: invalid message type 255将画质调低解决该问题

【FMC173】l基于VITA57.1标准的4通道4GSPS AD采集、4通道12GSPS DA回放FMC子卡模块

产品概述 FMC173是一款基于VITA57.1标准的,实现4路12-bit、4GSPS ADC采集功能、4路16-bit 12GSPS DA回放的FMC子卡模块。该模块遵循VITA57.1(HPC)标准,搭配FPGA载板可以灵活的实现多通道高速采集与回放功能。模块的主芯片采用ADI公司高度集成的AD9081芯片,该芯片与ADI公司…

数字化办公新宠:文档协作工具如何重塑团队协作?

文档协作工具以其强大的功能为团队管理者带来了诸多便利。在选择适合的工具时,团队管理者应根据团队规模、需求以及预算等因素进行综合考虑。同时,还应关注工具的安全性、易用性以及与其他应用程序或系统的集成能力等方面。通过合理利用文档协作工具的功能优势,团队管理者可…