OpenShift 4 - 用 oc-mirror 为离线 OpenShift 集群的 Mirror Registry 同步容器镜像

news/2024/11/10 12:03:29/

《OpenShift / RHEL / DevSecOps 汇总目录》
本文适合 OpenShift 4.11 及其以上版本。

文章目录

  • 在离线环境中用 OpenShift 准备 Mirror Registry
    • 环境说明
    • 向隔离环境复制镜像
      • 准备节点环境
        • bastion 节点操作
        • support 节点操作
      • 网络完全隔离环境-复制镜像
        • bastion 节点操作
        • support 节点操作
      • 网络部分隔离环境-复制镜像
        • bastion 节点操作
    • 切换 Catalog Source
    • 更新 Operator 列表
  • oc-mirror 命令说明
    • 列出已有 release 版本
    • 查看 operator 列表
    • 初始化 imageset config 文件
    • 下载 Image
    • 检查 Image 是否有更新
  • 参考

在离线环境中用 OpenShift 准备 Mirror Registry

环境说明

bastion 节点support 节点
作用可以访问互联网,但不可以访问 OpenShift 集群,用来下载离线的容器 Image不能访问互联网,但可以访问 OpenShift 集群,用来运行 mirror registry 服务
配置RHEL8/1vcpu/4GB 250GB (根据需要调整)RHEL8/2vcpu/8GB 500GB (根据需要调整)

向隔离环境复制镜像

向隔离环境复制容器镜像可以分为 “网络完全隔离环境” 和 “网络部分隔离环境” 两种场景。无论是哪种场景,都先按以下说明准备 bastion 和 support 节点环境。

准备节点环境

  1. 先在两个节点中执行以下命令,其中为 SUPPORT_HOSTNAME 设置了完整的全域名。
yum install podman rsync glibc -y
export SUPPORT_HOSTNAME=<SUPPORT-NODE-FQDN>
export OCP_VER_S=4.16
export OCP_VER_L=4.16.4
export MIRROR_DATA_PATH=/data/ocp4/mirror-data
export MIRROR_REGISTRY_PATH=/data/ocp4/mirror-registry
export COMMAND_PATH=/data/ocp4/oc
mkdir -p $MIRROR_DATA_PATH $MIRROR_REGISTRY_PATH $COMMAND_PATH
bastion 节点操作
  1. 下载 mirror-registry 软件,oc 客户端和 oc-mirror 插件。
curl -L -o $MIRROR_REGISTRY_PATH/mirror-registry.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/mirror-registry/latest/mirror-registry.tar.gz## OCP 4.14 及其以前版本
curl -L -o $COMMAND_PATH/oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VER_L/openshift-client-linux.tar.gz
## OCP 4.15 及其以后版本
curl -L -o $COMMAND_PATH/oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VER_L/openshift-client-linux-amd64-rhel8.tar.gz  
tar -xzf $COMMAND_PATH/oc.tar.gz -C $COMMAND_PATH occurl -L -o $COMMAND_PATH/oc-mirror.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VER_L/oc-mirror.tar.gz
tar -xzf $COMMAND_PATH/oc-mirror.tar.gz -C $COMMAND_PATH
chmod +x $COMMAND_PATH/oc-mirrorrm -f $COMMAND_PATH/oc.tar.gz $COMMAND_PATH/oc-mirror.tar.gz
  1. 下载用来从 registry.redhat.io、quay.io 等官方网站下载镜像的 pull-secret 。
mkdir $HOME/.docker
curl -L -o $HOME/.docker/config.json https://gitee.com/dawnskyliu/ocp/raw/master/pull-secret.json
  1. 将以上下载的文件从 bastion 节点传到 support 节点对应目录。
rsync -avP $MIRROR_REGISTRY_PATH/* root@$SUPPORT_HOSTNAME:$MIRROR_REGISTRY_PATH
rsync -avP $COMMAND_PATH/* root@$SUPPORT_HOSTNAME:$COMMAND_PATH
support 节点操作
  1. 创建 mirror registry 运行环境,默认软件将安装在 $HOME/quay-install 目录下。完成后可以看到 mirror registry 的访问地址,可以用浏览器访问该地址。
$ tar -xzvf $MIRROR_REGISTRY_PATH/mirror-registry.tar.gz -C $MIRROR_REGISTRY_PATH
$ cd $MIRROR_REGISTRY_PATH && ./mirror-registry install --initUser quayadmin --initPassword PASSWORD
。。。。
PLAY RECAP *****************************************************************************************************************************
lab-user@ip-10-0-50-115.us-east-2.compute.internal : ok=55   changed=35   unreachable=0    failed=0    skipped=16   rescued=0    ignored=0INFO[2024-08-01 11:38:05] Quay installed successfully, config data is stored in ~/quay-install
INFO[2024-08-01 11:38:05] Quay is available at https://ip-10-0-50-115.us-east-2.compute.internal:8443 with credentials (quayadmin, PASSWORD)
  1. 让 support 系统信任 mirror registry 的自签名 TLS 证书。
cp -v $HOME/quay-install/quay-rootCA/rootCA.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust
  1. 确认可以登录 mirror registry,然后查看生成的默认认证文件。
$ podman login $SUPPORT_HOSTNAME:8443 -u quayadmin -p PASSWORD
$ more $XDG_RUNTIME_DIR/containers/auth.json
{"auths": {"ip-10-0-50-115.us-east-2.compute.internal:8443": {"auth": "cXVheWFkbWluOlBBU1NXT1JE"}}
}

网络完全隔离环境-复制镜像

完全隔离环境是指 bastion 和 support 节点之间的网络无法直接连通的情况,这样只能先在 bastion 节点用 oc-mirror 命令将容器 Image 下载到文件系统中,然后再将离线文件传到 support 节点,最后再在 support 节点中用 oc-mirror 命令将这些 Image 从文件导入到运行在 support 节点的 mirror registry 里。

bastion 节点操作
  1. 创建 imageset-config.yaml 文件,它定义了将在 mirror registry 中存储的的 OpenShift 发行版、Operator 和其他独立镜像。如果需要增加其他 Image,可以向以下文件追加内容即可。说明:可参考下节使用 oc-mirror 命令获得 OpenShift 和 Operator 的版本信息。
cat << EOF > $MIRROR_DATA_PATH/imageset-config-1.yaml
kind: ImageSetConfiguration
apiVersion: mirror.openshift.io/v1alpha2
storageConfig:local:path: $MIRROR_DATA_PATH
mirror:platform:channels:- name: stable-$OCP_VER_Stype: ocpminVersion: $OCP_VER_LmaxVersion: $OCP_VER_Loperators:- catalog: registry.redhat.io/redhat/redhat-operator-index:v$OCP_VER_Spackages:- name: web-terminalchannels:- name: fastadditionalImages:- name: registry.redhat.io/rhel8/support-toolshelm: {}
EOF
  1. 将 Image 离线文件下载到 bastion 节点本地,最后会看到生成 mirror_seq1_000000.tar 文件的提示。
$COMMAND_PATH/oc-mirror --config $MIRROR_DATA_PATH/imageset-config-1.yaml file://$MIRROR_DATA_PATH
  1. 将离线文件复制到被隔离的 support 节点。
rsync -avP $MIRROR_DATA_PATH/* root@$SUPPORT_HOSTNAME:$MIRROR_DATA_PATH
support 节点操作
  1. 将离线 Image 文件导入 mirror registry。
$ cd $MIRROR_DATA_PATH && $COMMAND_PATH/oc-mirror --from=./mirror_seq1_000000.tar docker://$SUPPORT_HOSTNAME:8443
。。。
Wrote release signatures to oc-mirror-workspace/results-1722514691
Rendering catalog image "ip-10-0-50-115.us-east-2.compute.internal:8443/redhat/redhat-operator-index:v4.14" with file-based catalog
Writing image mapping to oc-mirror-workspace/results-1722514691/mapping.txt
Writing CatalogSource manifests to oc-mirror-workspace/results-1722514691
Writing ICSP manifests to oc-mirror-workspace/results-1722514691

网络部分隔离环境-复制镜像

部分隔离环境是指 bastion 和 support 节点之间的网络可以直接连通的情况,这样可以直接在 bastion 节点用 oc-mirror 命令下载 Image 并同时传入运行在 support 节点上的 mirror registry 里,在这个过程中 Image 无需落地到 bastion 节点的存储中。

bastion 节点操作
  1. 将访问 support 节点上 mirror registry 的认证信息写入用来保存 pull-secret 的 config.json 文件。
podman login -u quayadmin -p PASSWORD $SUPPORT_HOSTNAME:8443 --authfile $HOME/.docker/config.json
  1. 此时可通过 config.json 同时访问外部 registry 和内部的 mirror registry(如下面的 ip-10-0-50-115.us-east-2.compute.internal:8443)。
$ cat $HOME/.docker/config.json
{"auths": {"cloud.openshift.com": {"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K29jbV9hY2Nlc3NfOGI1MGUwNjBiNWYwNDAzMGIxM2YwNjBlMjRhYzQzZWU6UEtHNlpWVTlPNzhRS0ZGS1UzTTA0SkpZWFNEOTBBSUgzU0JMN1RQUFhTWlRGWFY3UzBDUzBEUDZBU0xITVlHMA=="},"ip-10-0-50-115.us-east-2.compute.internal:8443": {"auth": "cXVheWFkbWluOlBBU1NXT1JE"},"quay.io": {"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K29jbV9hY2Nlc3NfOGI1MGUwNjBiNWYwNDAzMGIxM2YwNjBlMjRhYzQzZWU6UEtHNlpWVTlPNzhRS0ZGS1UzTTA0SkpZWFNEOTBBSUgzU0JMN1RQUFhTWlRGWFY3UzBDUzBEUDZBU0xITVlHMA=="},"registry.connect.redhat.com": {"auth": "fHVoYy1wb29sLWY1ZjAwNDllLTQwNzktNDJkZi05YzA3LTUzODVjM2UyZGE5NTpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSm1aV0l5TW1Ga09ETmxORFUwT0dKa09XUTVaR1JpTmpRME1tSTFaVEk1T0NKOS5TalV0VTJUYzVQWEw0UVZVS0U4NWpFaGNmajNzR1NmQWFmbTRGclVVR09UNWc3RlBOZHB4V2lFeTd4eVVRbmtTaTBxSERselcyczJlN3lhQzE0ODE4N05VUmFvZ0Q5UGptMWozWG9SUTBRY2R6c3VBdkNKcTY5dW9rQXU4MjU3T2tMQWNxWjJ5T3huS19LVXlIc01FZ2pLMXFtWWU4c0xfOE91UmV4Yk8weGlhNTZYSV9fdlc4cUNMZUZXRTdPQkMzSFJDcE5oRWRJeElYZEVPV3dMZnhIblN0ZFA3TVZaRTZveEowblZpckFyZUh5SV85bnU2aDFTSm5fa2pvTW5vM3l5MU1KdVk4MkNoY1JFa0VsUkRaNDMxRUo0R0lUM1YtRGxyNVdRNHhUcG15M3V2TDdFQXQ1cTlwZldDdUNiNWRLXzdwR2dMbkRmOWtRb3k1U053dS13TDI0UEFta2J6b1ZWV0FDclY4WFhGZ2cyTTBoRS1OVkExdGlvLUlLelFRX2ZlWm53cVpLZWEwek1HRzVtY3lKTzlsYlNGRHE3X0Q1TnpDandMVzhOY3RRYzJTRVVrMnBkWjd1eWdqQ1N3dWpNbTVmRWNLcVp5eWh4UTlGMDhSanMyZTd2Vm44enFwQWEzNWlhb2V1U0RtVVhpa0xfZzZ6VDA5VzlWRHExM2JDeXR4eVAzUFJhdExNUGlIcXpjZ0NZd0dJcTl5a3FIMXd3X0RzdDRtcEpUUl85QlphVVRZN0NQQjg5a3Z2SzFWQTM3RWVtTnl3YlZOR1FIcDA5NGJvcmwtZk8zNTIteGFhaHY5TEg2dDlwTUsxWmRTT2RIR21PQXZEUmc0NkV3T0RIY0tBX1B0eFZOYTVUbjVuLXNGVUlJYkl0eC1DcDdSUXVGaFo4QndMMA=="},"registry.redhat.io": {"auth": "fHVoYy1wb29sLWY1ZjAwNDllLTQwNzktNDJkZi05YzA3LTUzODVjM2UyZGE5NTpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSm1aV0l5TW1Ga09ETmxORFUwT0dKa09XUTVaR1JpTmpRME1tSTFaVEk1T0NKOS5TalV0VTJUYzVQWEw0UVZVS0U4NWpFaGNmajNzR1NmQWFmbTRGclVVR09UNWc3RlBOZHB4V2lFeTd4eVVRbmtTaTBxSERselcyczJlN3lhQzE0ODE4N05VUmFvZ0Q5UGptMWozWG9SUTBRY2R6c3VBdkNKcTY5dW9rQXU4MjU3T2tMQWNxWjJ5T3huS19LVXlIc01FZ2pLMXFtWWU4c0xfOE91UmV4Yk8weGlhNTZYSV9fdlc4cUNMZUZXRTdPQkMzSFJDcE5oRWRJeElYZEVPV3dMZnhIblN0ZFA3TVZaRTZveEowblZpckFyZUh5SV85bnU2aDFTSm5fa2pvTW5vM3l5MU1KdVk4MkNoY1JFa0VsUkRaNDMxRUo0R0lUM1YtRGxyNVdRNHhUcG15M3V2TDdFQXQ1cTlwZldDdUNiNWRLXzdwR2dMbkRmOWtRb3k1U053dS13TDI0UEFta2J6b1ZWV0FDclY4WFhGZ2cyTTBoRS1OVkExdGlvLUlLelFRX2ZlWm53cVpLZWEwek1HRzVtY3lKTzlsYlNGRHE3X0Q1TnpDandMVzhOY3RRYzJTRVVrMnBkWjd1eWdqQ1N3dWpNbTVmRWNLcVp5eWh4UTlGMDhSanMyZTd2Vm44enFwQWEzNWlhb2V1U0RtVVhpa0xfZzZ6VDA5VzlWRHExM2JDeXR4eVAzUFJhdExNUGlIcXpjZ0NZd0dJcTl5a3FIMXd3X0RzdDRtcEpUUl85QlphVVRZN0NQQjg5a3Z2SzFWQTM3RWVtTnl3YlZOR1FIcDA5NGJvcmwtZk8zNTIteGFhaHY5TEg2dDlwTUsxWmRTT2RIR21PQXZEUmc0NkV3T0RIY0tBX1B0eFZOYTVUbjVuLXNGVUlJYkl0eC1DcDdSUXVGaFo4QndMMA=="}}
}
  1. 生成以下 imageset-config-2.yaml 文件。它定义了将在 mirror registry 中存储的的 OpenShift 发行版、Operator 和其他独立镜像。如果需要增加新的 Image,向文件追加内容即可。
$ cat << EOF > $MIRROR_DATA_PATH/imageset-config-2.yaml
kind: ImageSetConfiguration
apiVersion: mirror.openshift.io/v1alpha2
storageConfig:registry:imageURL: $SUPPORT_HOSTNAME:8443/mirror/metadataskipTLS: false
mirror:platform:channels:- name: stable-$OCP_VER_Stype: ocpminVersion: $OCP_VER_LmaxVersion: $OCP_VER_Loperators:- catalog: registry.redhat.io/redhat/redhat-operator-index:v$OCP_VER_Spackages:- name: web-terminalchannels:- name: fastadditionalImages:- name: registry.redhat.io/rhel8/support-toolshelm: {}
EOF
  1. 根据 imageset-config-2.yaml 下载镜像,并将镜像直接推送到 support 节点上的 mirror registry 中。
$ cd $MIRROR_DATA_PATH && $COMMAND_PATH/oc-mirror --config ./imageset-config-2.yaml docker://$SUPPORT_HOSTNAME:8443
。。。
Writing image mapping to oc-mirror-workspace/results-1722516790/mapping.txt
Writing CatalogSource manifests to oc-mirror-workspace/results-1722516790
Writing ICSP manifests to oc-mirror-workspace/results-1722516790
deleting directory /tmp/render-unpack-1928395028
deleting directory /tmp/imageset-catalog-registry-3569095946
  1. 将同步结果 oc-mirror-workspace/result* 文件夹复制到能够访问 OpenShift 集群的 support 节点。
rsync -avP $MIRROR_DATA_PATH/oc-mirror-workspace/result* root@$SUPPORT_HOSTNAME:$MIRROR_DATA_PATH/oc-mirror-workspace

切换 Catalog Source

在可以访问到 OpenShift 集群的 support 节点上执行:

  1. 在安装好的 OpenShift 离线集群中需要关闭其缺省自带的 catalog source。
$ oc get CatalogSource -n openshift-marketplace
NAME                  DISPLAY               TYPE   PUBLISHER   AGE
certified-operators   Certified Operators   grpc   Red Hat     28m
community-operators   Community Operators   grpc   Red Hat     28m
redhat-marketplace    Red Hat Marketplace   grpc   Red Hat     28m
redhat-operators      Red Hat Operators     grpc   Red Hat     28m$ oc patch OperatorHub cluster --type merge -p '{"spec": {"disableAllDefaultSources": true}}'

在这里插入图片描述

  1. 编辑 oc-mirror-workspace/result*/catalogSource-cs-redhat-operator-index.yaml 文件,添加以下内容(每 3 分钟自动更新 Operator 列表),然后创建 CatalogSource 对象,这样就启用了自己的 catalog source。注意:由于 oc - mirror 每次在 results-XXXXX 目录生成的 catalogSource-cs-redhat-operator-index.yaml 文件内容都一样,因此以下命令只需要执行一次即可。
cat << EOF >> $MIRROR_DATA_PATH/oc-mirror-workspace/results-XXXXX/catalogSource-cs-redhat-operator-index.yamldisplayName: Disconnected Red Hat Catalogpublisher: MeupdateStrategy:registryPoll:interval: 3m
EOF oc create -f $MIRROR_DATA_PATH/oc-mirror-workspace/results-XXXXX/catalogSource-cs-redhat-operator-index.yaml

更新 Operator 列表

每次有新的 OpenShift 发行版、新的 Operator 或新的 Image 同步到 mirror registry 后,如果没有为 CatalogSource 配置上一步的 updateStrategy 自动更新策略,则还需要在可以访问到 OpenShift 集群的节点上执行以下命令:

  1. 添加 ImageContentSourcePolicy 配置。
oc apply -f oc-mirror-workspace/results-XXXXX/imageContentSourcePolicy.yaml
  1. 查看运行 cs-redhat-operator-index 的 Pod 更新情况。
oc get pod -n openshift-marketplace -w
  1. 确认新的 Operator 已出现在 OperatorHub 中,例如 vertical-pod-autoscaler 是新追加的 Operator。
$ oc get packagemanifest -n openshift-marketplace
NAME                    CATALOG   AGE
web-terminal                      2m36s
devworkspace-operator             2m36s
vertical-pod-autoscaler           2m36s

oc-mirror 命令说明

oc-mirror 插件会使用名为 imageset-config 的配置文件,该文件定义了镜像注册表的内容。oc-mirror 的两个主要输出是镜像注册表有效载荷(称为图像集)和元数据文件(用于存储先前生成的图像集的信息)。在这里插入图片描述

列出已有 release 版本

列出 OpenShift 发行版本,缺省会使用 default channel。

oc-mirror list releases
oc-mirror list releases --version=4.16

查看 operator 列表

oc-mirror list operators --catalogs --version=4.14
oc-mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.14 > redhat-operator.out
oc-mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.14--package=openshift-pipelines-operator-rh
oc-mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v--package=openshift-pipelines-operator-rh --channel=stable

初始化 imageset config 文件

oc-mirror init

下载 Image

适用于网络完全隔离环境:

oc-mirror --config imageset-config.yaml file:///path/to/archives
oc-mirror --from /path/to/archives docker://$SUPPORT_HOSTNAME:8443

适用于网络部分隔离环境:

oc-mirror --config imageset-config.yaml docker://$SUPPORT_HOSTNAME:8443

检查 Image 是否有更新

oc-mirror list updates --config imageset-config.yaml

参考

https://www.redhat.com/en/blog/mirroring-openshift-registries-the-easy-way
https://www.redhat.com/en/blog/how-oc-mirror-will-help-you-reduce-container-management-complexity
https://www.redhat.com/en/blog/introducing-mirror-registry-for-red-hat-openshift
https://two-oes.medium.com/deploying-a-single-operator-on-openshift-disconnected-22e01b44a5d1
https://medium.com/@santivelazquez/how-to-install-operators-in-openshift-on-an-air-gapped-environment-oc-mirror-480204e06ac6
https://naps-product-sa.github.io/ocp4-disconnected-workshop/modules/index.html
https://danielchg.github.io/posts/oc-mirror/
https://access.redhat.com/solutions/7047539
https://access.redhat.com/solutions/6994677
https://github.com/openshift/oc-mirror/blob/main/docs/usage.md
https://people.redhat.com/mskinner/rhug/q4.2022/Edge-with-OC-Mirror.pdf
https://medium.com/@abhichandra1998/installing-operators-in-a-disconnected-openshift-cluster-129af21cd904
https://docs.openshift.com/container-platform/4.16/operators/admin/olm-managing-custom-catalogs.html#olm-creating-catalog-from-index_olm-managing-custom-catalogs
https://shonpaz.medium.com/dealing-with-air-gapped-environments-just-got-much-easier-bab6b76e44f2
https://developers.redhat.com/articles/2024/07/23/how-get-red-hat-openshift-operators-information-without-oc-mirror-plug


http://www.ppmy.cn/news/1505645.html

相关文章

C语言实现UDP广播

UDP 广播发送方 1.创建套接字&#xff1a;使用socket()函数创建一个UDP套接字。 2.设置套接字选项&#xff1a;使用setsockopt()函数设置SO_BROADCAST选项以允许广播。 3.发送数据&#xff1a;使用sendto()函数将数据发送到特定的广播地址和端口。 #include <stdio.h> …

Unity实现屏幕黑边--游戏画面和UI异形屏处理(安全区渲染)

在手机上&#xff0c;如果想以黑边形式显示游戏画面&#xff0c;比如显示区域避开异形屏、水滴屏那一行。有很多种思路&#xff0c;最后觉得下面这种方法比较简单合适&#xff0c;下面分享一下。 方法&#xff1a;需要分别处理&#xff0c;游戏画面黑边、UI黑边&#xff1a; …

免费https证书申请和安装

一、申请免费SSL证书 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; 对于个人博客、小型企业网站或非盈利组织&#xff0c;可以选择JoySSL等提供免费SSL证书的服务商。JoySSL因其完全免费和广泛支持的特点而受到许多用户的青睐。用户注册-JoySSLhttps://www.joyssl…

.NET C# 将文件夹压缩至 zip

.NET C# 将文件夹压缩至 zip 文章目录 .NET C# 将文件夹压缩至 zip1 使用 System.IO.Compression1.1 环境1.2 压缩文件夹1.2.1 简单压缩1.2.2 复杂压缩 1.3 解压缩1.3.1 简单解压缩1.3.2 复杂解压缩 2 使用 SharpZipLib2.1 环境2.2 压缩文件夹2.3 解压缩 3 压缩效果简单测试 1 …

前端 CSS 20道面试题详解

引言 CSS 是前端开发中不可或缺的一部分&#xff0c;掌握 CSS 的基础知识和技巧对于前端开发者来说至关重要。本文将通过 20 道常见的 CSS 面试题&#xff0c;帮助你巩固 CSS 知识&#xff0c;准备面试。 1. 什么是盒模型&#xff1f; 答&#xff1a;盒模型是 CSS 中描述元素…

SpringBoot+Vue 简单小文章项目开发全过程

文章目录 一、项目介绍二、需求设计三、数据库设计四、项目构建项目技术选型:构建项目说明:项目架构mavenMySQLRedis 五、项目开发&#xff1a;项目开发思路&#xff1a;项目开发过程&#xff1a;1. 导入文件包/新建项目2. 新建子模块&#xff1a;common模块pojo模块server模块…

YN35V00018F2、KDRDE5K-31/30C40-111比例插装阀控制器

KDRDE5K-31/30C40-111、SKX5P-17-209、KDRDE5K-20/40C04-109、YN35V00049F1、KDRDE5K-31/40C50-213、111-9916、KDRDE5K-31/40E30-137、YN35V00019F1、KDRDE5K-31/30C40-101、YB35V00005F1、KDRDE5K-31/30C50-107、YB35V00004F1、KDRDE5K-20/30C12A-111、YN35V00048F1、KDRDE5K…

can not insert null to xxx.(ID)

场景&#xff1a; 在执行保存方法时报错can not insert null to xxx.(ID) 分析&#xff1a; 这个错误表明时因为数据库id设置了主键唯一且不为空&#xff0c;而插入的时候为null所以报错&#xff0c;我的项目使用的oracle数据库&#xff0c;跟mysql数据库直接设置自增不一样&…