通过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

相关推荐
星星点点洲14 分钟前
Docker常用命令
docker·容器
凤山老林9 小时前
Docker 部署 RabbitMQ | 自带延时队列
docker·容器·rabbitmq
自信人间三百年10 小时前
从零开始学Docker(一)-镜像列表访问不到问题
运维·docker·容器
大饼酥10 小时前
保姆级教程Docker部署Zookeeper模式的Kafka镜像
docker·zookeeper·kafka
大熊程序猿12 小时前
docker grafana安装
docker·容器·grafana
凤山老林14 小时前
Docker 部署 verdaccio 搭建 npm 私服
前端·docker·容器·npm
小Tomkk14 小时前
Docker 部署 Grafana 教程
docker·容器·grafana
问道飞鱼19 小时前
【服务器知识】linux环境下安装docker
linux·服务器·docker·安装部署
学Linux的语莫20 小时前
k8s中,一.service发布服务,二.dashboard:基于网页的k8s管理插件,三.资源服务与帐号权限
linux·运维·服务器·docker·容器·k8s
三天不学习21 小时前
Docker Compose 容器卷映射:是否需要提前将文件拷贝到宿主机?
docker·容器·eureka·docker compose·容器卷映射