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

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

  • [1. 挂载目录](#1. 挂载目录)
  • [2. DockerFile](#2. DockerFile)
  • [3. 运行脚本deploy.sh](#3. 运行脚本deploy.sh)
  • [4. 运行](#4. 运行)
  • [5. 接口测试](#5. 接口测试)
  • [6. 优化Dockerfile](#6. 优化Dockerfile)
  • [7. 部分参数解释](#7. 部分参数解释)
  • [8. 优化不同环境下的日志也不同](#8. 优化不同环境下的日志也不同)
  • [9. pplication.yml、application-dev.yml、application-test.yml、application-prod.yml这几个有什么区别?](#9. pplication.yml、application-dev.yml、application-test.yml、application-prod.yml这几个有什么区别?)

1. 挂载目录

注意这里没有使用docker-compose



2. DockerFile

java 复制代码
# 使用适合 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

java 复制代码
#!/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. 运行

java 复制代码
(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

查看日志

java 复制代码
(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     : 当前环境是:范缜

进入容器

java 复制代码
(base) ➜  docker-project docker exec -it docker-test-dev /bin/bash


宿主机中的application-dev.yml

5. 接口测试

java 复制代码
curl -X GET http://0.0.0.0:29898/api/v1/heart-beat

修改application-dev.yml

修改宿主机中的application-dev.yml

重新执行运行脚本就可以获取到最新的配置

6. 优化Dockerfile

java 复制代码
# 使用适合 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

java 复制代码
(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 复制代码
# 使用适合 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

java 复制代码
#!/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

没问题

java 复制代码
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 复制代码
java -jar your-application.jar --spring.profiles.active=dev

或者在环境变量中设置:

java 复制代码
export SPRING_PROFILES_ACTIVE=dev

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

相关推荐
ascarl20106 小时前
k8s系列--通过docker拉取的镜像导入到 containerd中
docker·容器·kubernetes
northeastsqure8 小时前
docker 基本使用
docker
PyAIGCMaster8 小时前
docker学习记录:本地部署mongodb
学习·mongodb·docker
拾荒的小海螺9 小时前
Docker:安装 XXL-JOB 分布式调度任务的技术指南
运维·docker·容器
跳跳的向阳花11 小时前
02、Docker学习,理论知识,第二天:基础概念与常用命令
学习·docker·容器
hoppss11 小时前
根据docker file 编译镜像
运维·docker·容器
qq_4298565711 小时前
docker 删除容器和镜像
运维·docker·容器
PyAIGCMaster11 小时前
Docker学习记录:安装nginx
学习·nginx·docker
Rossy Yan12 小时前
入门级容器技术解析:Docker和K8s的区别与关系
docker·容器·kubernetes
ccmjga19 小时前
升级 Spring Boot 3 配置讲解 —— 如何在 Spring Boot 3 中接入生成式 AI?
java·人工智能·spring boot·后端·docker·面试·单元测试