独立开发经验谈:我是如何借助 Docker 环境变量让客户 1 分钟上线客服系统的
我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营一款独立产品的经验。
我之前写过一篇文章,介绍如何用 Docker 让潜在客户快速体验你的独立产品。
有朋友看到这篇文章之后,试用了产品并且给了我新的建议:用 Docker 环境变量让试用更方便。在此感谢这位 xj 的朋友。
我的例子
在前一篇文章中,要运行我制作的在线客服系统 Docker 镜像为例,需要 2 个命令:
从 Docker Hub 下载升讯威在线客服系统镜像
docker pull iccb1013/linkup:latest
启动容器(之前的命令)
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_image
environment:
- MY_ENV_VAR=value
- ANOTHER_VAR=another_value
此外,也可以从 .env
文件加载环境变量:
version: '3'
services:
webapp:
image: my_image
env_file:
- .env
3.5 通过 docker exec
查看环境变量
可以通过 docker exec
进入容器内部,使用 env
或 printenv
命令查看容器中的环境变量:
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 或多容器应用中,环境变量的作用域仅限于指定的容器,跨容器传递时需要显式声明。
钟意的话请给个赞支持一下吧,谢谢~
独立开发经验谈:我是如何借助 Docker 环境变量让客户 1 分钟上线客服系统的的更多相关文章
- 【转帖】linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York
linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York 2015-02-10 10:58:22 youcha ...
- 开发升讯威在线客服系统启示录:怎样编写堪比 MSDN 的用户手册
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程. 免费在线使用 & 免费私有化部署:https://kf.shengxunwei.com 文章目 ...
- 用SignalR 2.0开发客服系统[系列1:实现群发通讯]
前言 交流群:195866844 先说一下我为什么会写这个博客吧,(首先说一下,我是一个小菜鸟,讲的不好请指导 - -,) 前段时间公司的项目涉及到在B/S上使用即时通讯,(其实就是做一个B/S的客 ...
- 使用 WPF+ ASP.NET MVC 开发 在线客服系统 (一)
近段时间利用业余时间开发了一套在线客服系统,期间遇到过大大小小不少问题,好在都一一解决,最终效果也还可以,打算写一个系列的文章把开发过程详细的记录下来. 希望能够和更多的开发人员互相交流学习,也希望有 ...
- 用SignalR 2.0开发客服系统[系列2:实现聊天室]
前言 交流群:195866844 上周发表了 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 这篇文章,得到了很多帮助和鼓励,小弟在此真心的感谢大家的支持.. 这周继续系列2,实现聊天室 ...
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 真的很感谢大家的支持,今天发表系列3 ...
- 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...
- 用SignalR 2.0开发客服系统[系列5:使用SignalR的中文简体语言包和其他技术点]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...
- Docker 版 3分钟部署 .net core 开源在线客服系统,他来了
我在博客园发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 前些天又应朋友的要求,发了一篇 CentOS 版本的安装部署教程:https://www.cnblogs.com ...
- Linux + .net core 开发升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法
前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 有很多朋友一直提出希望能够支持 MySQL 数据库,考虑到已经有朋友在用 SQL Server,我在升级的过程中 ...
随机推荐
- TreeMap源码分析——基础分析(基于JDK1.6)
常见的数据结构有数组.链表,还有一种结构也很常见,那就是树.前面介绍的集合类有基于数组的ArrayList,有基于链表的LinkedList,还有链表和数组结合的HashMap,今天介绍基于树的Tre ...
- Threejs入门-灯光
在 Three.js 中,灯光是非常重要的元素之一,它能够模拟现实世界中的光照效果,帮助我们打造更加真实的三维场景.灯光的种类和配置方式可以影响整个场景的视觉效果,在不同的应用中,灯光的使用非常关键. ...
- canvas(二)直线样式和虚线
1.设置直线线帽的样式 相关语法:ctx.lineCap,通过赋值形式来设置直线线帽的样式,他有以下3个值: 值 说明 butt 默认 round 圆形线帽 square 正方形线帽 <scri ...
- 语音转文字-Microsoft Azure Speech Service与Web Speech API实战
简介 在现代技术驱动的世界中,语音识别已成为人机交互的重要方式.Microsoft Azure Speech Service 提供了强大的语音转文本功能,允许开发者轻松地将语音数据转换为文本.本文将指 ...
- 服务迁移之《mysql数据同步问题》
我们大概是从2022年十月份开始进行拆分的.面对一百多个服务的时候,真的是无从下手,然后公司突然空降了一个从阿里出来的架构师,然后就带着我们大刀阔斧的整体迁移. 先是服务器购买阿里云的,然后从几个核心 ...
- openEuler创建和root一样的账号
1. 使用以下命令在 openEuler 操作系统的 root 用户下创建管理员用户: useradd -m -G root admin -m 表示创建用户的同时创建用户的主目录, -G 表示将用户添 ...
- 【软件配置】使用 brew 安装特定版本软件
目录 使用 brew 安装特定版本软件 背景 方法一:直接安装 方法二:利用历史的 rb 文件安装 参考资料 使用 brew 安装特定版本软件 背景 brew 是 Mac 下非常好用的包管理工具,可以 ...
- Member not found: ’packageRoot’ in Flutter
path/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.0/ lib/src/interface/local_platform.dar ...
- .NET 7 中的限流
.NET 中的限流 https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/ 这里我们要宣布的是集成为 .N ...
- GraphQL Part VIII: 使用一对多查询
今天,我们引入两个新的实体来处理客户与订单.客户与订单之间是一对多的关系,一个客户可以拥有一个或者多个订单,反过来,一个订单只能被某个客户所拥有. 可以按照 Engity Framework 的约定配 ...