百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

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

yund56 2025-03-06 14:45 6 浏览

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

我之前写过一篇文章,介绍如何用 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_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 进入容器内部,使用 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.2API 密钥

很多应用依赖于外部服务的 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 或多容器应用中,环境变量的作用域仅限于指定的容器,跨容器传递时需要显式声明。

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

相关推荐

如何在Office 中编辑 PDF?附详细化步骤

PDF很受欢迎,因为它能在不同的设备和操作系统上仍然保持原有格式。但是,这也意味着直接更改PDF文件比其他格式更难更复杂。值得庆幸的是,Microsoftoffice和UPDF帮你解决这一难题。一...

我的 Windows 装机必备软件清单

今天给大家分享下我的装机必备软件,都是用了好多年的软件神器。靠谱、好用、无广告,Windows电脑必备软件,收藏这一篇就够了!01.浏览器王者:Chromehttps://www.google.c...

Docnet Core 是一个轻量级、高性能的 .NET PDF 操作库

DocnetCore介绍DocnetCore是一个轻量级、高性能的.NETPDF操作库,依托于PDFium渲染引擎,提供强大的PDF文档解析、渲染、操作等功能。它完全支持.NET...

分享三款好用的PDF编辑软件,轻松处理PDF

作为一名需要经常和PDF文件打交道的工作者,我来分享一下几款好用的PDF编辑软件,并详细分析了它们的优缺点,希望能帮你找到合适的工具。1.AdobeAcrobatDC作为PDF格式的发明者,Ado...

PDF文档创建工具软件:novaPDF OEM 11.9 Build 432 for Windows

novaPDFOEM是一款实用高效的软件,从头开始设计,让您尽可能轻松地在应用程序中添加PDF打印功能。换句话说,这个实用程序是专门为应用程序开发人员设计的,可以直接在程序安装程序中集成为PDF打印...

线性表顺序存储结构求集合的并,交,补,差(源代码附上 超详细)

一:算法分析1)用数组A,B,C,E表示集合。假定A={1,3,4,5,6,7,9,10},  B={2,,3,4,7,8,10},E={1,2,3,4,5,6,7,8,9,10},  输入数组A...

分享一套SpringBoot开发博客系统源码,包含完整开发文档和视频

基本信息项目名称:eblog摘要:eblog是一个基于Springboot2.1.2开发的博客学习项目,为了让项目融合更多的知识点,达到学习目的,编写了详细的从0到1开发文档。主要学习包括:自定义Fr...

通达信指标合集〔源码齐全〕

很多朋友问到我哪款指标好用,这里我说一下,之所以有很多不同的指标是因为我们在针对不同的盘面情况的时候使用的指标是不同的,我给到的指标一般来讲就目前的环境来讲都是比较适合的,今天我就把我平时自己常用的指...

巅峰对决!Spring Boot VS .NET 6

SpringBoot和ASP.NETCore都是企业中流行的Web框架,对于喜欢C#的人会使用ASP.NETCore,而对于Java或Kotlin等基于JVM的语...

在asp.net core 中控制访问权限的方法

Intro#由于项目需要,需要在基于asp.netmvc的Web项目框架中做权限的控制,于是才有了这个权限控制组件,最初只是支持netframework,后来dotnetcore2.0...

ASP.NET是否无生存之地?

ASP.NET,这个已经很久的技术,总觉得已经被时代淘汰,我们公司是一个10人小公司,几个十年十五年的项目还是用ASP.NET开发的。这两年由于客户的需求变化,我们公司也顺势开始对这些项目重新开发,改...

Spring Boot + Vue.js 实现前后端分离(附源码)

作者:梁小生0101链接:juejin.im/post/5c622fb5e51d457f9f2c2381SpringBoot+Vue.js前后端涉及基本概念介绍,搭建记录,本文会列举出用到环...

ASP.NET Core 中的 Mapster 使用入门教程

在本文中,我们将学习如何在ASP.NETCore应用程序中使用Mapster。首先,我们将了解Mapster是什么以及如何将其安装到.NETCore应用程序中。然后,我们将在使用...

Asp.net常用方法及request和response-a

asp.net教程asp.net常用方法:1、Request.UrlReferrer请求的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造(比如迅雷)。(使用全局一般处理...

ASP.NET Core使用功能开关控制路由访问

前言在前面的文章,我们介绍了使用Middleware有条件地允许访问路由(《ASP.NETCore使用Middleware有条件地允许访问路由》)。而对于一些试验性的功能,我们并不希望用密码去控制是...