• 一种DockerCompose环境变量统一处理方式
  • 发布于 2个月前
  • 339 热度
    0 评论
前言
以Nacos为注册中心的Spring Cloud微服务工程,通过Docker Compose方式部署到Dev & Test环境,容器和宿主机使用不同的网络命名空间,各微服务注册到Nacos中的IP为Docker虚拟网卡发放的内网IP而非宿主机IP。

问题
随着工程需求量的逐步增长,各微服务之间RPC调用增多。在本机进行开发调试时,需本机启动各个依赖的服务并且将流量导入本机才能进行开发与调试。

处理思路
基于当前服务部署情况的处理思路,暂未考虑重构部署方式。
第一种: 在Docker启动时自动获取宿主机IP,然后将获取到的IP替换application.yml中的spring.cloud.nacos.discovery.ip内容。没搞定,后面再研究。
第二种:  在Docker启动时获取统一环境变量配置文件中的宿主机IP,然后将获取到的IP替换application.yml中的spring.cloud.nacos.discovery.ip内容。搞定了,下面叙述我的实现方式。

实现方式
1.docker-compose.yml中配置统一环境变量
services:
  server-name:
    env_file:
      - ./env_file.txt
    build:
      context: *****
    restart: always
    ports:
      - port:port
    container_name: *****
    image: *****
    networks:
      - server_default
2.env_file.txt内容
#env_file.txt
HOST_IP=宿主机IP
3.微服务的application.yml内容
spring:
  cloud:
    nacos:
      username: nacos
      password: nacos
      discovery:
        server-addr: 127.0.0.1:8848
        ip: localhost
4.微服务的DockerFile内容
# 使用适当的基础映像
FROM openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /app
# 将应用程序JAR文件复制到容器中
COPY target/<your-application-jar>.jar app.jar
# 将应用程序application文件上传到容器中
ADD ./target/classes/application.yml ./
# 设置应用程序的默认启动命令
CMD sleep 20;sed -i 's/localhost/'$HOST_IP'/g' application.yml;java -jar app.jar
重点内容
#将文件中的localhost替换为环境变量中的宿主机IP
sed -i 's/localhost/'$HOST_IP'/g' application.yml;

涉及知识点
1.env_file
在Docker Compose中,env_file选项用于指定一个或多个环境变量文件,以从文件中加载环境变量到容器中。你可以在docker-compose.yml文件中使用env_file选项来指定一个或多个环境变量文件,例如:
# 堆代码 duidaima.com
version: '3'
services:
  myapp:
    image: myapp
    env_file:
      - ./env/common.env
      - ./env/dev.env

上述示例中,我们指定了两个环境变量文件common.env和dev.env,它们位于一个名为env的目录下。Docker Compose会在运行容器时读取这些文件,并将其中定义的环境变量加载到容器中。请注意,环境变量文件的格式应为KEY=VALUE,每行一个环境变量定义。

示例文件内容如下:common.env:

DB_HOST=db
DB_PORT=5432
dev.env:
DEBUG=true
使用env_file选项可以轻松地管理各个环境的环境变量,将它们与容器的配置分离,使得配置更加灵活和可维护。

DockerFile中的CMDDockerfile中的CMD指令用于设置容器启动时要执行的默认命令。它可以有两种不同的形式:
EXEC格式:
CMD ["可执行文件", "参数1", "参数2", ...]
在这种形式下,指定的命令将直接作为容器的默认启动命令。它们不会通过 shell 进行解释,而是作为可执行文件和参数传递给容器的进程。例如:
CMD ["node", "app.js"]
上述示例中,容器将在启动时执行node app.js命令。

Shell 格式:
CMD command param1 param2 ...
在这种形式下,指定的命令将通过 shell 进行解释。可以使用 shell 的功能,例如使用通配符、重定向等。例如:
CMD sleep 20;npm start
上述示例中,容器将在启动时通过 shell 解释先睡眠20秒再执行npm start命令。

spring.cloud.nacos.discovery.ip在Nacos中,spring.cloud.nacos.discovery.ip是一个配置属性,用于设置Nacos服务发现的IP地址。当应用程序作为Nacos客户端注册到Nacos服务注册中心时,可以使用该属性指定注册的IP地址。根据该属性的设置,Nacos客户端可以将自身注册到指定IP地址的Nacos注册中心实例。这在配置多个Nacos注册中心实例、或者需要将应用程序与Nacos注册中心分开部署的场景中特别有用。在Spring Boot应用程序的配置文件(例如application.properties或application.yml)中,可以使用以下方式设置spring.cloud.nacos.discovery.ip属性的值:
spring.cloud.nacos.discovery.ip=your_ip_address
将your_ip_address替换为具体的IP地址。如果未显式设置该属性,Nacos客户端将默认使用主机的IP地址进行注册和发现。请注意,spring.cloud.nacos.discovery.ip属性仅适用于Nacos服务发现,用于指定注册的IP地址。

参考文献
[1] Nacos官方文档 . https://nacos.io/zh-cn/docs/v2/guide/user/sdk.html
[2] Docker官方文档 . https://docs.docker.com/engine/reference/builder/
[3] Docker官方文档 . https://docs.docker.com/compose/environment-variables/envvars/
用户评论