使用Docker启用MySQL8.0.11

news2024/12/20 21:48:37

目录

一、Docker减小镜像大小的方式

1、基础镜像选择

2、减少镜像层数

3、清理无用文件和缓存

4、优化文件复制(COPY和ADD指令)

二、Docker镜像多阶段构建

1、什么是dockers镜像多阶段构建

1.1 概念介绍

1.2 构建过程和优势

2、怎样在Dockerfile中实现多阶段构建

2.1 基本语法和步骤

2.2 示例:构建一个 Java 应用程序的多阶段镜像

2.3 注意事项

三、使用Dockerfile构建MySQL8.0.11

1、创建Dockerfile

2、启动新容器并创建用户

3、创建新容器并使用之前的数据


一、Docker减小镜像大小的方式

1、基础镜像选择

  • 选择合适的基础镜像:
    • 从官方仓库选择精简的基础镜像,如alpine。alpine是一个轻量级的 Linux 发行版,它的镜像体积通常很小。例如,构建一个 Python 应用,使用python:alpine作为基础镜像,相比python:ubuntu等镜像,体积会小很多。因为alpine在设计上注重小巧和简单,包含的软件包都是最基本的,没有过多的额外组件。
  • 基于特定场景定制基础镜像:
    • 如果对基础系统有特殊要求,可以基于更底层的基础镜像(如scratch)来构建。scratch是一个空白的镜像,几乎没有任何内容。这种情况下,需要自己将应用所需的最小运行时环境打包进去。例如,对于一个静态编译的 Go 程序,可以使用scratch作为基础镜像,将编译好的二进制文件直接复制到镜像中,这样构建出来的镜像体积会非常小。

2、减少镜像层数

  • 合并RUN指令:
    • 在Dockerfile中,每一个RUN指令都会创建一个新的镜像层。为了减少层数,应尽量合并相关的命令。例如,不要使用多个RUN指令分别安装软件包,而是将它们合并在一个RUN指令中。比如,不是这样写:
RUN apt-get update
RUN apt-get install -y package1
RUN apt-get install -y package2

3、清理无用文件和缓存

  • 在构建过程中清理缓存:
    • 对于基于apt(Debian/Ubuntu)或yum(CentOS 等)的系统,在安装完软件包后,清理软件包缓存。例如,在RUN指令中安装完apt - get软件包后,使用RUN apt-get clean来清理apt缓存。同样,对于yum,可以使用RUN yum clean all来清理yum缓存。这样可以减少镜像中不必要的文件占用空间。
  • 删除临时文件和无用文件:
    • 在构建过程中,如果生成了一些临时文件或者不再需要的文件,应该及时删除。例如,在编译软件时,可能会生成一些中间的编译文件,这些文件在软件安装完成后就不再需要,可以在Dockerfile中添加命令来删除它们。比如,在构建一个 C/C++ 应用的镜像时,在RUN指令中编译完程序后,可以使用RUN rm -rf /path/to/temporary/compilation/files来删除编译过程中的临时文件。

4、优化文件复制(COPY和ADD指令)

  • 只复制必要的文件:
    • 在使用COPY或ADD指令时,只复制应用真正需要的文件和目录到镜像中。避免将整个项目目录(包括开发工具、测试文件等)都复制进去。例如,如果是一个 Web 应用,只需要将生产环境下的 HTML、CSS、JavaScript 文件和服务器端代码复制到镜像中,而不需要复制开发过程中的单元测试文件等。
  • 使用.dockerignore文件:
    • 创建一个.dockerignore文件,在这个文件中列出不需要复制到镜像中的文件和目录模式。例如,如果项目目录中有.git文件夹(包含版本控制信息)、node_modules(对于 Node.js 应用,如果已经有package.json和package - lock.json,可以在镜像构建过程中重新安装依赖,不需要复制本地的node_modules)等,可以在.dockerignore文件中添加.git和node_modules,这样在构建镜像时,Docker会自动忽略这些文件和目录,从而减小复制到镜像中的文件体积。

二、Docker镜像多阶段构建

1、什么是dockers镜像多阶段构建

1.1 概念介绍

Docker 多阶段构建是一种在构建 Docker 镜像时使用的技术,它允许将镜像构建过程划分为多个不同的阶段。每个阶段都可以基于不同的基础镜像或者具有不同的构建目的,并且可以在不同阶段之间传递文件。通过这种方式,可以构建出更加精简、高效且安全的 Docker 镜像。

1.2 构建过程和优势

  • 减小镜像体积:
    • 在传统的单阶段构建中,如果要构建一个包含编译环境和运行环境的应用镜像,例如一个 Go 语言应用,构建过程中需要安装 Go 编译器和相关的编译工具来编译代码,同时还需要将运行应用所需的库和二进制文件打包到镜像中。这会导致镜像中包含大量的编译工具和中间文件,使镜像体积变大。
    • 而在多阶段构建中,可以先使用一个包含 Go 编译器的基础镜像来编译应用,生成可执行文件。然后在第二阶段,使用一个更精简的基础镜像(如alpine),只将编译好的可执行文件复制到这个镜像中,抛弃了编译环境相关的工具和文件,从而大大减小了最终镜像的体积。
  • 提高安全性:
    • 以一个包含敏感信息(如数据库连接密码)的应用为例。在单阶段构建中,如果构建过程中涉及到在镜像中设置密码等操作,这些敏感信息可能会留在最终的镜像中,存在安全风险。
    • 在多阶段构建中,可以在一个阶段(如开发环境阶段)处理敏感信息相关的操作,然后在构建最终生产环境镜像的阶段,只将必要的、经过处理的应用组件复制过来,避免敏感信息泄露到生产环境镜像中,提高了镜像的安全性。
  • 分离关注点:
    • 对于复杂的应用构建,不同的构建阶段可能有不同的目标。例如,在第一阶段进行代码编译、测试,在第二阶段进行打包和配置运行环境。多阶段构建可以清晰地将这些不同的关注点分开,使得构建过程更加易于理解和维护。
  • 示例
    • 以构建一个 Node.js 应用为例,第一阶段可以使用node:14 - builder(假设这是一个包含构建工具的 Node.js 镜像)来安装项目依赖并构建应用:
FROM node:14 - builder
WORKDIR /app
COPY package*.json./
RUN npm install
COPY..
RUN npm run build

2、怎样在Dockerfile中实现多阶段构建

2.1 基本语法和步骤

  • 多个FROM指令:
    • 在Dockerfile中,通过使用多个FROM指令来划分不同的构建阶段。每个FROM指令开始一个新的构建阶段,并且可以基于不同的基础镜像。例如,第一阶段可能基于一个包含编译工具的基础镜像,用于构建应用程序;第二阶段可以基于一个更精简的运行时基础镜像,用于运行最终的应用。
  • 阶段命名(可选):
    • 可以为每个阶段指定一个名称,这在需要引用特定阶段时非常有用。命名是在FROM指令后使用AS关键字来实现的。例如,FROM node:14 - builder AS builder_stage,这里将第一个阶段命名为builder_stage。
  • 文件复制(COPY或ADD)在阶段之间:
    • 使用COPY或ADD指令在不同阶段之间传递文件。关键是要使用--from选项来指定从哪个阶段复制文件。例如,COPY --from = builder_stage /app/dist.表示从名为builder_stage的阶段复制/app/dist目录下的文件到当前阶段的当前目录(.)。

2.2 示例:构建一个 Java 应用程序的多阶段镜像

  • 第一阶段:构建应用(使用maven构建工具):
FROM maven:3.8.4 - openjdk - 11 AS build
WORKDIR /app
COPY pom.xml.
RUN mvn dependency:go-off-line
COPY src./src
RUN mvn package - DskipTests

2.3 注意事项

  • 缓存利用:
    • 在多阶段构建中,每个阶段的构建缓存是独立的。Docker 会根据每个阶段的FROM指令和后续的构建指令来判断是否可以使用缓存。因此,合理安排构建顺序和指令内容可以更好地利用缓存,提高构建效率。
  • 基础镜像选择:
    • 每个阶段要根据其功能选择合适的基础镜像。如在编译阶段选择包含完整编译工具链的镜像,在运行阶段选择只包含运行时必要组件的镜像,这样才能充分发挥多阶段构建减小镜像体积的优势。

三、使用Dockerfile构建MySQL8.0.11

1、创建Dockerfile

# 使用官方MySQL 8.0镜像作为基础镜像
FROM mysql:8.0
 
# 设置环境变量,用于初始化数据库
ENV MYSQL_DATABASE=db_name
ENV MYSQL_USER=user_name
ENV MYSQL_PASSWORD=user_password
ENV MYSQL_ROOT_PASSWORD=root_password
 
# 复制初始化脚本到容器内
COPY ./init.sql /docker-entrypoint-initdb.d/
 
# 容器将以daemon模式运行MySQL服务
CMD ["mysqld"]

命令示例:

cat >Dockerfile <<'eof'
FROM mysql:8.0.11
ENV MYSQL_DATABASE=MineGi
ENV MYSQL_USER=test11
ENV MYSQL_PASSWORD=123456
ENV MYSQL_ROOT_PASSWORD=666666
COPY ./init.sql /docker-entrypoint-initdb.d/
CMD ["mysqld"]
eof

cat >init.sql <<'eof'
CREATE TABLE test11 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
eof

ls
docker build -t mysql:v8 .

输出结果:

[root@MineGi ~]# cat >Dockerfile <<'eof'
> FROM mysql:8.0.11
> ENV MYSQL_DATABASE=MineGi
> ENV MYSQL_USER=test11
> ENV MYSQL_PASSWORD=123456
> ENV MYSQL_ROOT_PASSWORD=666666
> COPY ./init.sql /docker-entrypoint-initdb.d/
> CMD ["mysqld"]
> eof
[root@MineGi ~]# cat >init.sql <<'eof'
> CREATE TABLE test11 (
>     id INT AUTO_INCREMENT PRIMARY KEY,
>     username VARCHAR(50) NOT NULL,
>     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
> );
> eof
[root@MineGi ~]# ls
Dockerfile  init.sql
[root@MineGi ~]# docker build -t mysql:v8 .
[+] Building 0.1s (7/7) FINISHED                                                                                                   docker:default
 => [internal] load build definition from Dockerfile                                                                                         0.0s
 => => transferring dockerfile: 222B                                                                                                         0.0s
 => [internal] load metadata for docker.io/library/mysql:8.0.11                                                                              0.0s
 => [internal] load .dockerignore                                                                                                            0.0s
 => => transferring context: 2B                                                                                                              0.0s
 => [internal] load build context                                                                                                            0.0s
 => => transferring context: 187B                                                                                                            0.0s
 => [1/2] FROM docker.io/library/mysql:8.0.11                                                                                                0.0s
 => CACHED [2/2] COPY ./init.sql /docker-entrypoint-initdb.d/                                                                                0.0s
 => exporting to image                                                                                                                       0.0s
 => => exporting layers                                                                                                                      0.0s
 => => writing image sha256:10b79382712d1c5e721fd28cab3194c6818606784110fa68520bce220c33474d                                                 0.0s
 => => naming to docker.io/library/mysql:v8                                                                                                  0.0s
[root@MineGi ~]# 

2、启动新容器并创建用户

命令示例:

docker run --name my_mysql -v mysql_data:/var/lib/mysql -d mysql:v8
docker exec -it my_mysql mysql -uroot -p666666
create user 'test-1'@'%' identified by '123456';
grant all on MineGi.* to 'test-1'@'%';
flush privileges;
exit
docker stop my_mysql
docker rm my_mysql

输出结果:

[root@MineGi ~]# docker run --name my_mysql -v mysql_data:/var/lib/mysql -d mysql:v8
c397aefbc2b61dba29ba48c3c32322058b052b5c45cd5c1c7162734d076bd09d
[root@MineGi ~]# docker exec -it my_mysql mysql -uroot -p666666
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create user 'test-1'@'%' identified by '123456';
Query OK, 0 rows affected (0.11 sec)

mysql> grant all on MineGi.* to 'test-1'@'%';
Query OK, 0 rows affected (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
[root@MineGi ~]# docker stop my_mysql
my_mysql
[root@MineGi ~]# docker rm my_mysql
my_mysql
[root@MineGi ~]#

3、创建新容器并使用之前的数据

命令示例:

mkdir -p /data/mysql/data
cp -a /var/lib/docker/volumes/mysql_data/_data/* /data/mysql/data
docker run --name my_mysql -v /data/mysql/data:/var/lib/mysql -d mysql:v8
docker exec -it my_mysql mysql -utest-1 -p123456
show databases;
show tables in MineGi;

输出结果:

[root@MineGi ~]# mkdir -p /data/mysql/data
[root@MineGi ~]# cp -a /var/lib/docker/volumes/mysql_data/_data/* /data/mysql/data
[root@MineGi ~]# docker run --name my_mysql -v /data/mysql/data:/var/lib/mysql -d mysql:v8
e5b8cec1fda1bd811c3e2828369b5380b623f02e4c1b9d8cde47ca87aaa3d82e
[root@MineGi ~]# docker exec -it my_mysql mysql -utest-1 -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| MineGi             |
| information_schema |
+--------------------+
2 rows in set (0.01 sec)

mysql> show tables in MineGi;
+------------------+
| Tables_in_MineGi |
+------------------+
| test11           |
+------------------+
1 row in set (0.01 sec)

mysql>

 情况说明:对于数据库的数据目录。可以直接使用Bind Mount方式挂载

关于这方面的解释如下:

  • 理解数据持久化的概念
    • 当你将 Docker 容器中的数据库目录持久化到宿主机时,实际上是将容器内的数据存储位置映射到了宿主机的文件系统中。
    • 例如,对于 MySQL 容器,其内部存储数据的目录(如/var/lib/mysql)通过-v(volume)参数挂载到宿主机的某个目录。
  • 容器启动时的数据加载
    • 如果在容器启动之前,挂载的宿主机目录中已经存在有效的数据库文件,容器内的数据库服务在启动时会加载这些文件。
    • 以 MySQL 为例,当容器中的 MySQL 服务启动时,它会检查数据目录(现在已经挂载到宿主机)中的文件。如果存在数据库文件(如.frm、.ibd等 MySQL 数据文件格式),它会读取这些文件来恢复数据库的状态,包括数据库、表结构和数据等内容。
  • 数据共享和同步机制
    • 这种持久化方式使得容器和宿主机之间的数据共享成为可能。在容器运行期间,对数据库的任何写入操作(如插入、更新数据),实际上是在宿主机挂载的目录中对应的文件上进行写入。
    • 这是因为容器内的数据库进程认为数据目录就是它正常存储数据的地方,而这个目录已经被挂载到宿主机,所以数据会持久地保存在宿主机上,并且在容器重新启动等情况下可以被再次加载和使用。
  • 容器镜像初始内容的复制
    • 当你使用docker run命令并挂载了一个宿主机上不存在的目录(如/data/test01)到容器内的/var/lib/mysql(MySQL 数据存储目录)时,Docker 会自动将容器内部/var/lib/mysql目录中的初始内容复制到宿主机挂载点。
    • 对于mysql:v8这个镜像,其内部/var/lib/mysql目录已经包含了 MySQL 初始化所需要的一些系统文件,如配置文件(auto.cnf)、证书文件(ca.pem、client - cert.pem等)以及数据库初始文件(ibdata1、ib_logfile0等)。这些文件在容器启动并挂载卷时被复制到了宿主机的/data/test01目录。
  • 数据库文件系统的初始化机制
    • MySQL 等数据库在启动时会检查数据目录是否为空。如果数据目录不存在某些关键文件,它会尝试初始化这些文件。
    • 由于容器镜像中已经有了这些初始化文件,当通过挂载卷的方式将容器内的数据目录和宿主机目录关联起来时,这些初始化文件就被复制到了宿主机,使得在宿主机挂载点看起来有了内容。这些文件是数据库正常运行所必需的,后续数据库的操作(如创建表、插入数据等)也会将数据存储在这个挂载的目录中,保证数据的持久化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2262919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows安全中心(病毒和威胁防护)的注册

文章目录 Windows安全中心&#xff08;病毒和威胁防护&#xff09;的注册1. 简介2. WSC注册初探3. WSC注册原理分析4. 关于AMPPL5. 参考 Windows安全中心&#xff08;病毒和威胁防护&#xff09;的注册 本文我们来分析一下Windows安全中心&#xff08;Windows Security Center…

Hive其一,简介、体系结构和内嵌模式、本地模式的安装

目录 一、Hive简介 二、体系结构 三、安装 1、内嵌模式 2、测试内嵌模式 3、本地模式--最常使用的模式 一、Hive简介 Hive 是一个框架&#xff0c;可以通过编写sql的方式&#xff0c;自动的编译为MR任务的一个工具。 在这个世界上&#xff0c;会写SQL的人远远大于会写ja…

时空AI赋能低空智能科技创新

随着人工智能技术的不断进步&#xff0c;时空人工智能&#xff08;Spatio-Temporal AI&#xff0c;简称时空AI&#xff09;正在逐渐成为推动低空经济发展的新引擎。时空AI结合了地理空间智能、城市空间智能和时空大数据智能&#xff0c;为低空智能科技创新提供了强大的数据支持…

java 通过jdbc连接sql2000方法

1、java通过jdbc连接sql2000 需要到三个jar包&#xff1a;msbase.jar mssqlserver.jar msutil.jar 下载地址&#xff1a;https://download.csdn.net/download/sunfor/90145580 2、将三个jar包解压到程序中的LIB下&#xff1a; 导入方法&#xff1a; ①在当前目录下&#xff…

web实验二

web实验二 2024.12.19 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>青岛理工大学</title>&l…

纯前端实现更新检测

通过判断打包后的html文件中的js入口是否发生变化&#xff0c;进而实现前端的代码更新 为了使打包后的文件带有hash值&#xff0c;需要对vite打包进行配置 import { defineConfig } from vite; import vue from vitejs/plugin-vue; import { resolve } from path; import AutoI…

云原生周刊:Kubernetes v1.32 正式发布

开源项目推荐 Helmper Helmper 简化了将 Helm Charts导入OCI&#xff08;开放容器倡议&#xff09;注册表的过程&#xff0c;并支持可选的漏洞修复功能。它确保您的 Helm Charts不仅安全存储&#xff0c;还能及时应用最新的安全修复。该工具完全兼容 OCI 标准&#xff0c;能够…

【游戏中orika完成一个Entity的复制及其Entity异步落地的实现】 1.ctrl+shift+a是飞书下的截图 2.落地实现

一、orika工具使用 1)工具类 package com.xinyue.game.utils;import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory;/*** author 王广帅* since 2022/2/8 22:37*/ public class XyBeanCopyUtil {private static MapperFactory mappe…

如何在繁忙的生活中找到自己的节奏?

目录 一、理解生活节奏的重要性 二、分析当前生活节奏 1. 时间分配 2. 心理状态 3. 身体状况 4. 生活习惯 1. 快慢适中 2. 张弛结合 3. 与目标相符 三、掌握调整生活节奏的策略 1. 设定优先级 2. 合理规划时间 3. 学会拒绝与取舍 4. 保持健康的生活方式 5. 留出…

CORDIC 算法实现 _FPGA

注&#xff1a;本文为 “CORDIC 算法” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 Cordic 算法的原理介绍 乐富道 2014-01-28 23:05 Cordic 算法知道正弦和余弦值&#xff0c;求反正切&#xff0c;即角度。 采用用不断的旋转求出对应的正弦余弦值&…

鸿蒙学习笔记:用户登录界面

文章目录 1. 提出任务2. 完成任务2.1 创建鸿蒙项目2.2 准备图片资源2.3 编写首页代码2.4 启动应用 3. 实战小结 1. 提出任务 本次任务聚焦于运用 ArkUI 打造用户登录界面。需呈现特定元素&#xff1a;一张图片增添视觉感&#xff0c;两个分别用于账号与密码的文本输入框&#…

着色器 (三)

今天&#xff0c;是我们介绍opengl着色器最后一章&#xff0c;着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序&#xff0c;因为它们之…

leetcode:3285. 找到稳定山的下标(python3解法)

难度&#xff1a;简单 有 n 座山排成一列&#xff0c;每座山都有一个高度。给你一个整数数组 height &#xff0c;其中 height[i] 表示第 i 座山的高度&#xff0c;再给你一个整数 threshold 。 对于下标不为 0 的一座山&#xff0c;如果它左侧相邻的山的高度 严格大于 thresho…

深度学习之超分辨率算法——SRGAN

更新版本 实现了生成对抗网络在超分辨率上的使用 更新了损失函数&#xff0c;增加先验函数 SRresnet实现 import torch import torchvision from torch import nnclass ConvBlock(nn.Module):def __init__(self, kernel_size3, stride1, n_inchannels64):super(ConvBlock…

集成方案 | Docusign + 金蝶云,实现合同签署流程自动化!

本文将详细介绍 Docusign 与金蝶云的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 在当今商业环境中&#xff0c;流程的无缝整合与数据的实时性对于企业的成功至关重要。金蝶云&…

数据结构----链表头插中插尾插

一、链表的基本概念 链表是一种线性数据结构&#xff0c;它由一系列节点组成。每个节点包含两个主要部分&#xff1a; 数据域&#xff1a;用于存储数据元素&#xff0c;可以是任何类型的数据&#xff0c;如整数、字符、结构体等。指针域&#xff1a;用于存储下一个节点&#…

Service Discovery in Microservices 客户端/服务端服务发现

原文链接 Client Side Service Discovery in Microservices - GeeksforGeeks 原文链接 Server Side Service Discovery in Microservices - GeeksforGeeks 目录 服务发现介绍 Server-Side 服务发现 实例&#xff1a; Client-Side 服务发现 实例&#xff1a; 服务发现介绍…

Git连接远程仓库(超详细)

目录 一、Gitee 远程仓库连接 1. HTTPS 方式 2. SSH公钥方式 &#xff08;1&#xff09;账户公钥 &#xff08;2&#xff09;仓库公钥 仓库的 SSH Key 和账户 SSH Key 的区别&#xff1f;​ 二、GitHub远程仓库连接 1. HTTPS方式 2.SSH公钥方式 本文将介绍如何通过 H…

系列4:基于Centos-8.6 Kubernetes多网卡节点Calico选择网卡配置

每日禅语 不动心”是一个人修养和定力的体现&#xff0c;若一个人心无定力&#xff0c;就会被外界环境左右&#xff0c;随外界的境遇而动摇。佛家认为&#xff0c;心是一切的基础&#xff0c;一个人如果想要真正入定&#xff0c;必须先从修心开始。修心即是净心&#xff0c;心灵…

Docker:Dockerfile(补充四)

这里写目录标题 1. Dockerfile常见指令1.1 DockerFile例子 2. 一些其他命令 1. Dockerfile常见指令 简单的dockerFile文件 FROM openjdk:17LABEL authorleifengyangCOPY app.jar /app.jarEXPOSE 8080ENTRYPOINT ["java","-jar","/app.jar"]# 使…