当前位置: 首页 > article >正文

通过Dockerfile来实现项目可以指定读取不同环境的yml包

通过Dockerfile来实现项目可以指定读取不同环境的yml包

  • 1. 挂载目录
  • 2. DockerFile
  • 3. 运行脚本deploy.sh
  • 4. 运行
    • 查看日志
    • 进入容器
  • 5. 接口测试
    • 修改application-dev.yml
  • 6. 优化Dockerfile
  • 7. 部分参数解释
  • 8. 优化不同环境下的日志也不同
    • 调整 Dockerfile
    • 修改部署脚本 deploy.sh
    • 重新运行dev与prod
    • 最新的目录
  • 9. pplication.yml、application-dev.yml、application-test.yml、application-prod.yml这几个有什么区别?

1. 挂载目录

在这里插入图片描述

注意这里没有使用docker-compose

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. DockerFile

# 使用适合 Java 8 的官方镜像
FROM openjdk:8-jre-slim

# 创建一个目录来存放应用
WORKDIR /app

# 复制 jar 文件和配置文件到容器
COPY ./docker-test-0.0.1-SNAPSHOT.jar /app/docker-test.jar
COPY ./config /app/config

# 创建日志目录
RUN mkdir /app/logs

# 暴露应用端口
EXPOSE 9898

# 设置环境变量默认值
ENV SPRING_PROFILES_ACTIVE=dev

# 运行 Java 应用,指定配置文件位置
ENTRYPOINT ["java", "-jar", "-Dspring.config.location=/app/config/", "-Dlogging.file.name=/app/logs/app.log", "docker-test.jar"]

3. 运行脚本deploy.sh

#!/bin/bash

# 部署脚本使用方式: ./deploy.sh [环境名]
# 环境名应为 dev 或 prod

ENV=$1
if [ "$ENV" != "prod" ] && [ "$ENV" != "dev" ]; then
  echo "请指定正确的环境名: dev 或 prod"
  exit 1
fi

# 定义容器和镜像名称
CONTAINER_NAME="docker-test-$ENV"
IMAGE_NAME="docker-test:$ENV"

# 为不同环境设置不同的端口
if [ "$ENV" == "prod" ]; then
  PORT=19898
else
  PORT=29898
fi

# 构建 Docker 镜像
docker build -t $IMAGE_NAME .

# 停止并删除旧容器
docker rm -f $CONTAINER_NAME

# 运行新的 Docker 容器,挂载日志目录到宿主机,并设置环境变量
docker run -d -p $PORT:9898 \
  -e SPRING_PROFILES_ACTIVE=$ENV \
  -v /Users/fanzhen/Documents/docker-project/logs:/app/logs \
  --name $CONTAINER_NAME $IMAGE_NAME

echo "部署 $ENV 环境完成,访问端口:$PORT"

4. 运行

(base) ➜  docker-project sh deploy.sh dev
[+] Building 6.6s (10/10) FINISHED                                                                                                                                                                                                                    docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                  0.0s
 => => transferring dockerfile: 681B                                                                                                                                                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/openjdk:8-jre-slim                                                                                                                                                                                                 6.2s
 => [internal] load .dockerignore                                                                                                                                                                                                                                     0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                       0.0s
 => CACHED [1/5] FROM docker.io/library/openjdk:8-jre-slim@sha256:53186129237fbb8bc0a12dd36da6761f4c7a2a20233c20d4eb0d497e4045a4f5                                                                                                                                    0.0s
 => [internal] load build context                                                                                                                                                                                                                                     0.1s
 => => transferring context: 19.55MB                                                                                                                                                                                                                                  0.1s
 => [2/5] WORKDIR /app                                                                                                                                                                                                                                                0.1s
 => [3/5] COPY ./docker-test-0.0.1-SNAPSHOT.jar /app/docker-test.jar                                                                                                                                                                                                  0.0s
 => [4/5] COPY ./config /app/config                                                                                                                                                                                                                                   0.0s
 => [5/5] RUN mkdir /app/logs                                                                                                                                                                                                                                         0.1s
 => exporting to image                                                                                                                                                                                                                                                0.0s
 => => exporting layers                                                                                                                                                                                                                                               0.0s
 => => writing image sha256:c7dcfe05d6c1f467f03a24caafe8a66729f60fcebc2be42b2cbb398885503e1a                                                                                                                                                                          0.0s
 => => naming to docker.io/library/docker-test:dev                                                                                                                                                                                                                    0.0s

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/tc1irjdh2hiyks0o0k93zanrx

What's next:
    View a summary of image vulnerabilities and recommendations → docker scout quickview
Error response from daemon: No such container: docker-test-dev
8a8c4a71e3cad36c9fd2057dee84dbbedcefbc07c6d1ee3e057a96936f94bb1c
部署 dev 环境完成,访问端口:29898

在这里插入图片描述

查看日志

(base) ➜  docker-project docker logs docker-test-dev

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::               (v2.6.13)

2025-01-01 10:28:14.640  INFO 1 --- [           main] c.s.d.dockertest.DockerTestApplication   : Starting DockerTestApplication using Java 1.8.0_342 on 8a8c4a71e3ca with PID 1 (/app/docker-test.jar started by root in /app)
2025-01-01 10:28:14.642  INFO 1 --- [           main] c.s.d.dockertest.DockerTestApplication   : The following 1 profile is active: "dev"
2025-01-01 10:28:15.030  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 9898 (http)
2025-01-01 10:28:15.037  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-01-01 10:28:15.037  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.68]
2025-01-01 10:28:15.074  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2025-01-01 10:28:15.075  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 412 ms
2025-01-01 10:28:15.239  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9898 (http) with context path ''
2025-01-01 10:28:15.244  INFO 1 --- [           main] c.s.d.dockertest.DockerTestApplication   : Started DockerTestApplication in 0.797 seconds (JVM running for 1.053)
2025-01-01 10:29:49.797  INFO 1 --- [0.0-9898-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2025-01-01 10:29:49.798  INFO 1 --- [0.0-9898-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2025-01-01 10:29:49.799  INFO 1 --- [0.0-9898-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2025-01-01 10:29:49.811  INFO 1 --- [0.0-9898-exec-1] c.s.d.dockertest.HeartBeatController     : 当前环境是:范缜
2025-01-01 10:30:42.360  INFO 1 --- [0.0-9898-exec-3] c.s.d.dockertest.HeartBeatController     : 当前环境是:范缜

在这里插入图片描述

进入容器

(base) ➜  docker-project docker exec -it docker-test-dev /bin/bash

在这里插入图片描述
在这里插入图片描述

宿主机中的application-dev.yml
在这里插入图片描述

5. 接口测试

curl -X GET http://0.0.0.0:29898/api/v1/heart-beat

在这里插入图片描述

修改application-dev.yml

修改宿主机中的application-dev.yml
在这里插入图片描述

重新执行运行脚本就可以获取到最新的配置
在这里插入图片描述

6. 优化Dockerfile

# 使用适合 Java 8 的官方镜像,并指定具体的摘要
FROM openjdk:8-jre-slim@sha256:53186129237fbb8bc0a12dd36da6761f4c7a2a20233c20d4eb0d497e4045a4f5

# 创建一个目录来存放应用
WORKDIR /app

# 复制 jar 文件和配置文件到容器
COPY ./docker-test-0.0.1-SNAPSHOT.jar /app/docker-test.jar
COPY ./config /app/config

# 创建日志目录
RUN mkdir /app/logs

# 暴露应用端口
EXPOSE 9898

# 设置环境变量默认值
ENV SPRING_PROFILES_ACTIVE=dev

# 运行 Java 应用,指定配置文件位置
ENTRYPOINT ["java", "-jar", "-Dspring.config.location=/app/config/", "-Dlogging.file.name=/app/logs/app.log", "docker-test.jar"]

通过FROM openjdk:8-jre-slim@sha256:53186129237fbb8bc0a12dd36da6761f4c7a2a20233c20d4eb0d497e4045a4f5我就指定了每次运行得jdk,是我们已经下载的docker image

(base) ➜  docker-project sh deploy.sh prod
[+] Building 0.0s (10/10) FINISHED                                                                                                                                                                                                                         docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                       0.0s
 => => transferring dockerfile: 972B                                                                                                                                                                                                                                       0.0s
 => [internal] load metadata for docker.io/library/openjdk:8-jre-slim@sha256:53186129237fbb8bc0a12dd36da6761f4c7a2a20233c20d4eb0d497e4045a4f5                                                                                                                              0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                            0.0s
 => [1/5] FROM docker.io/library/openjdk:8-jre-slim@sha256:53186129237fbb8bc0a12dd36da6761f4c7a2a20233c20d4eb0d497e4045a4f5                                                                                                                                                0.0s
 => [internal] load build context                                                                                                                                                                                                                                          0.0s
 => => transferring context: 995B                                                                                                                                                                                                                                          0.0s
 => CACHED [2/5] WORKDIR /app                                                                                                                                                                                                                                              0.0s
 => CACHED [3/5] COPY ./docker-test-0.0.1-SNAPSHOT.jar /app/docker-test.jar                                                                                                                                                                                                0.0s
 => CACHED [4/5] COPY ./config /app/config                                                                                                                                                                                                                                 0.0s
 => CACHED [5/5] RUN mkdir /app/logs                                                                                                                                                                                                                                       0.0s
 => exporting to image                                                                                                                                                                                                                                                     0.0s
 => => exporting layers                                                                                                                                                                                                                                                    0.0s
 => => writing image sha256:f2ff23fd6cbdd0711a2236ed8fef5741a440ce0c9eef1de0729f0fe90bd5cd8f                                                                                                                                                                               0.0s
 => => naming to docker.io/library/docker-test:prod                                                                                                                                                                                                                        0.0s

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/w8k62khao04fqmmn40xbtlxkp

What's next:
    View a summary of image vulnerabilities and recommendations → docker scout quickview
Error response from daemon: No such container: docker-test-prod
26f15fa78e16ace7184b0350006371a9decb2311bc6df4753f2a3006b79ba726
部署 prod 环境完成,访问端口:19898

再次运行脚本就是秒启动了

在这里插入图片描述

7. 部分参数解释

  1. -Dspring.config.location=/app/config/ 是一个 JVM(Java Virtual Machine)系统属性,用于指定 Spring Boot 应用的配置文件位置。
    在这里插入图片描述

  2. -Dlogging.file.name=/app/logs/app.log Dockerfile 中使用的 ENTRYPOINT 命令包含了 -Dlogging.file.name=/app/logs/app.log 这一部分。这是一个 JVM(Java Virtual Machine)系统属性,用于指定日志文件的输出路径,特别是对于使用 Spring Boot 构建的 Java 应用。这样的设置对于管理容器内应用的日志是非常有用的。
    在这里插入图片描述

8. 优化不同环境下的日志也不同

docker images --digests本地所有镜像的信息,包括仓库名、标签、镜像 ID、创建时间、大小以及摘要(digest)

调整 Dockerfile

# 使用适合 Java 8 的官方镜像,并指定具体的摘要
FROM openjdk:8-jre-slim@sha256:53186129237fbb8bc0a12dd36da6761f4c7a2a20233c20d4eb0d497e4045a4f5

# 创建一个目录来存放应用
WORKDIR /app

# 复制 jar 文件和配置文件到容器
COPY ./docker-test-0.0.1-SNAPSHOT.jar /app/docker-test.jar
COPY ./config /app/config

# 创建日志目录
RUN mkdir /app/logs

# 设置时区
ENV TZ=Asia/Shanghai
RUN apt-get update && apt-get install -y tzdata \
    && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
    && echo $TZ > /etc/timezone \
    && dpkg-reconfigure -f noninteractive tzdata

# 暴露应用端口
EXPOSE 9898

# 设置环境变量默认值
ENV SPRING_PROFILES_ACTIVE=dev

# 运行 Java 应用,使用环境变量指定配置文件位置和日志文件名
ENTRYPOINT ["java", "-jar", "-Dspring.config.location=/app/config/", "-Dlogging.file.name=${LOG_FILE_PATH}", "docker-test.jar"]

修改部署脚本 deploy.sh

#!/bin/bash

# 部署脚本使用方式: ./deploy.sh [环境名]
# 环境名应为 dev 或 prod

ENV=$1
if [ "$ENV" != "prod" ] && [ "$ENV" != "dev" ]; then
  echo "请指定正确的环境名: dev 或 prod"
  exit 1
fi

# 定义容器和镜像名称
CONTAINER_NAME="docker-test-$ENV"
IMAGE_NAME="docker-test:$ENV"

# 为不同环境设置不同的端口和日志文件路径
if [ "$ENV" == "prod" ]; then
  PORT=19898
  LOG_FILE="/app/logs/prod-app.log"
else
  PORT=29898
  LOG_FILE="/app/logs/dev-app.log"
fi

# 停止之前的容器
docker stop $CONTAINER_NAME

# 停止并删除旧容器
docker rm -f $CONTAINER_NAME

# 构建 Docker 镜像
docker build -t $IMAGE_NAME .

# 检查日志文件是否存在,如果不存在则创建空日志文件
LOG_FILE_PATH="./logs/$ENV-app.log"
if [ ! -f "$LOG_FILE_PATH" ]; then
  touch "$LOG_FILE_PATH"
fi

# 运行新的 Docker 容器,挂载日志目录到宿主机,并设置环境变量
docker run -d -p $PORT:9898 \
  -e SPRING_PROFILES_ACTIVE=$ENV \
  -e LOG_FILE_PATH=$LOG_FILE \
  -v $LOG_FILE_PATH:$LOG_FILE \
  --name $CONTAINER_NAME $IMAGE_NAME

echo "部署 $ENV 环境完成,访问端口:$PORT"

注意这里不需要删除原来的镜像文件,如果换了新的jar包,会构建新的镜像替代原来的镜像

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

重新运行dev与prod

没问题

sh deploy.sh dev
sh deploy.sh prod

最新的目录

请忽略docker-compose
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9. pplication.yml、application-dev.yml、application-test.yml、application-prod.yml这几个有什么区别?

在现代软件开发中,尤其是使用Spring Boot这类框架时,application.yml文件通常用来存储应用程序的配置信息。为了适应不同的运行环境(如开发、测试、生产等),通常会有多个这样的配置文件,以便根据环境的不同加载不同的配置。下面是关于你提到的各个文件的详细解释:

  1. application.yml
    这是主配置文件,通常包含所有环境中通用的配置。它是默认被加载的配置文件,无论你运行在哪个环境中。此文件中的配置可以被其他环境专用的配置文件覆盖。

  2. application-dev.yml
    这个文件包含开发环境特有的配置。它通常包括适用于开发环境的数据库连接、API密钥、调试工具配置等。在开发过程中,可以设置Spring Boot使用dev配置文件,使其覆盖application.yml中的通用配置。

  3. application-test.yml
    此文件包含测试环境特有的配置,用于单元测试、集成测试等自动化测试环境。这些配置可能包括指向专门的测试数据库、特定的端口号或服务接口等。在自动化测试时,通过设置Spring Boot使用test配置文件,确保应用运行在适合测试的环境中。

  4. application-prod.yml
    这个文件包含生产环境特有的配置,如生产数据库的凭证、API访问限制、性能优化设置等。在应用部署到生产环境时,这个文件中的配置会覆盖默认的application.yml文件,确保应用按照生产环境的要求运行。

如何切换不同的配置环境
在Spring Boot应用中,你可以通过设置环境变量spring.profiles.active来指定激活哪个配置文件。例如,通过命令行参数来启动应用时指定使用开发配置:

java -jar your-application.jar --spring.profiles.active=dev

或者在环境变量中设置:

export SPRING_PROFILES_ACTIVE=dev

或者idea中的VM增加 -Dspring.profiles.active=prod


http://www.kler.cn/a/464438.html

相关文章:

  • ESP32自动下载电路分享
  • 《Swift 结构体》
  • YIG带通滤波器
  • PHP在做api开发中,RSA加密签名算法如何使用 ?
  • node内置模块之---path 模块
  • Cursor小试1.生成一个网页的接口请求工具
  • 24.Java 新特性扩展(重复注解、类型注解)
  • Docker隔离及资源限制原理
  • 参观华为-拓宽全球视野
  • ip属地是看运营商吗还是手机
  • 【C语言 采集数据 精简排序】
  • 数字化转型 · OCR 技术如何打破效率瓶颈?
  • SpringMVC(六)拦截器
  • 栈及栈的操作
  • 【three.js】材质(Material)
  • 《探寻真正开源的大模型:开启AI创新新纪元》
  • 5.微服务灰度发布落地实践(rocketmq增强)
  • Win11电脑Cursor默认打开markdown文件,如何修改markdown文件默认打开方式为Typora?
  • (四)配置有线网口、SSH登陆、文件传输以及运行交叉编译程序测试
  • SQL SERVER ——表的基本操作
  • 系统思考—信任
  • 解决安装pynini和WeTextProcessing报错问题
  • git 添加代理
  • 云手机:虚拟技术的革命性应用与实体手机的优劣对比
  • 小米PK霍尼韦尔宠物空气净化器谁更强?还有其他专业品牌吗?
  • 《燕云十六声》游戏文件tcj.dll已损坏怎么办?