From 6bd0967fdf51990c05223d6ddcfe221e3b20d565 Mon Sep 17 00:00:00 2001 From: wjunLu Date: Mon, 7 Jul 2025 15:51:37 +0800 Subject: [PATCH 1/6] Add milvus image --- Database/influxdb/doc/image-info.yml | 25 +++-- Database/mariadb/doc/image-info.yml | 25 ++--- .../milvus/2.5.14/24.03-lts-sp2/Dockerfile | 35 ++++++ Database/milvus/README.md | 99 +++++++++++++++++ Database/milvus/doc/image-info.yml | 104 ++++++++++++++++++ Database/milvus/doc/picture/logo.png | Bin 0 -> 31637 bytes 6 files changed, 263 insertions(+), 25 deletions(-) create mode 100644 Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile create mode 100644 Database/milvus/README.md create mode 100644 Database/milvus/doc/image-info.yml create mode 100644 Database/milvus/doc/picture/logo.png diff --git a/Database/influxdb/doc/image-info.yml b/Database/influxdb/doc/image-info.yml index 3e4ef276..ff56fbf4 100644 --- a/Database/influxdb/doc/image-info.yml +++ b/Database/influxdb/doc/image-info.yml @@ -1,35 +1,38 @@ -name: mariadb +name: influxdb category: database -description: MariaDB 服务器是社区开发的 MySQL 服务器分支。MariaDB 由原 MySQL 团队的核心成员创建,并积极与外部开发者合作,致力于提供业界功能最丰富、最稳定、许可最合理的开放 SQL 服务器。 +description: InfluxDB Core 是一款用于收集、处理、转换和存储事件及时间序列数据的数据库,非常适合需要实时数据采集和快速查询响应时间的用例,用于构建用户界面、监控和自动化解决方案。 environment: | 本应用在Docker环境中运行,安装Docker执行如下命令 ``` yum install -y docker ``` tags: | - mariadb镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 + influxdb镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 | Tag | Currently | Architectures | |----------|-------------|------------------| - |[11.7.2-oe2403sp1](https://gitee.com/openeuler/openeuler-docker-images/blob/master/Database/mariadb/11.7.2/24.03-lts-sp1/Dockerfile)| mariadb 11.7.2 on openEuler 24.03-LTS-SP1 | amd64, arm64 | + |[2.7.11-oe2403sp1](https://gitee.com/openeuler/openeuler-docker-images/blob/master/Database/influxdb/2.7.11/24.03-lts-sp1/Dockerfile)| Influxdb 2.7.11 on openEuler 24.03-LTS-SP1 | amd64, arm64 | download: | 拉取镜像到本地 ``` - docker pull openeuler/mariadb:{Tag} + docker pull openeuler/influxdb:{Tag} ``` usage: | - 启动mariadb实例: + 启动influxdb实例: ``` - docker network create some-network - docker run --detach --network some-network --name some-mariadb --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw openeuler/mariadb:{Tag} + docker run -it -p 8086:8086 openeuler/influxdb:{Tag} + ``` + 终端提示以下信息则表示influxdb已经ready: + ``` + 2025-07-02T02:07:01.507857Z info Listening {"log_id": "0xUE2JM0000", "service": "tcp-listener", "transport": "http", "addr": ":8086", "port": 8086} + 2025-07-02T02:07:01.507881Z info Starting {"log_id": "0xUE2JM0000", "service": "telemetry", "interval": "8h"} ``` - 启动后,用户可以从[MariaDB command line client](https://mariadb.com/kb/en/mariadb-command-line-client/)访问MariaDB。 -license: GPL-2.0 license +license: Apache-2.0 license similar_packages: - - MySQL + - N/A dependency: - N/A \ No newline at end of file diff --git a/Database/mariadb/doc/image-info.yml b/Database/mariadb/doc/image-info.yml index ff56fbf4..3e4ef276 100644 --- a/Database/mariadb/doc/image-info.yml +++ b/Database/mariadb/doc/image-info.yml @@ -1,38 +1,35 @@ -name: influxdb +name: mariadb category: database -description: InfluxDB Core 是一款用于收集、处理、转换和存储事件及时间序列数据的数据库,非常适合需要实时数据采集和快速查询响应时间的用例,用于构建用户界面、监控和自动化解决方案。 +description: MariaDB 服务器是社区开发的 MySQL 服务器分支。MariaDB 由原 MySQL 团队的核心成员创建,并积极与外部开发者合作,致力于提供业界功能最丰富、最稳定、许可最合理的开放 SQL 服务器。 environment: | 本应用在Docker环境中运行,安装Docker执行如下命令 ``` yum install -y docker ``` tags: | - influxdb镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 + mariadb镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 | Tag | Currently | Architectures | |----------|-------------|------------------| - |[2.7.11-oe2403sp1](https://gitee.com/openeuler/openeuler-docker-images/blob/master/Database/influxdb/2.7.11/24.03-lts-sp1/Dockerfile)| Influxdb 2.7.11 on openEuler 24.03-LTS-SP1 | amd64, arm64 | + |[11.7.2-oe2403sp1](https://gitee.com/openeuler/openeuler-docker-images/blob/master/Database/mariadb/11.7.2/24.03-lts-sp1/Dockerfile)| mariadb 11.7.2 on openEuler 24.03-LTS-SP1 | amd64, arm64 | download: | 拉取镜像到本地 ``` - docker pull openeuler/influxdb:{Tag} + docker pull openeuler/mariadb:{Tag} ``` usage: | - 启动influxdb实例: + 启动mariadb实例: ``` - docker run -it -p 8086:8086 openeuler/influxdb:{Tag} - ``` - 终端提示以下信息则表示influxdb已经ready: - ``` - 2025-07-02T02:07:01.507857Z info Listening {"log_id": "0xUE2JM0000", "service": "tcp-listener", "transport": "http", "addr": ":8086", "port": 8086} - 2025-07-02T02:07:01.507881Z info Starting {"log_id": "0xUE2JM0000", "service": "telemetry", "interval": "8h"} + docker network create some-network + docker run --detach --network some-network --name some-mariadb --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw openeuler/mariadb:{Tag} ``` + 启动后,用户可以从[MariaDB command line client](https://mariadb.com/kb/en/mariadb-command-line-client/)访问MariaDB。 -license: Apache-2.0 license +license: GPL-2.0 license similar_packages: - - N/A + - MySQL dependency: - N/A \ No newline at end of file diff --git a/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile b/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile new file mode 100644 index 00000000..20444092 --- /dev/null +++ b/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile @@ -0,0 +1,35 @@ +ARG BASE=openeuler/openeuler:24.03-lts-sp2 +FROM ${BASE} + +ARG VERSION=2.5.14 +ARG GOLANG_VERSION=1.21.10 +ARG TARGETARCH + +RUN yum install -y \ + sudo vim wget gcc g++ cmake make git \ + gfortran zip unzip libatomic numa* ninja* libstdc* \ + python3-pip openblas-devel && \ + yum clean all && \ + wget -O go.tar.gz https://golang.google.cn/dl/go${GOLANG_VERSION}.linux-${TARGETARCH}.tar.gz && \ + tar -xvf go.tar.gz -C /usr/local && \ + rm -rf go.tar.gz +ENV PATH=/usr/local/go/bin:$PATH + +RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain=1.73 -y && \ + pip install conan==1.61.0 +ENV PATH=/root/.cargo/bin:$PATH + +RUN wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-$TARGETARCH.tar.gz --no-check-certificate && \ + tar zxvf etcd-v3.5.0-linux-$TARGETARCH.tar.gz && \ + cp -r etcd-v3.5.0-linux-$TARGETARCH /usr/local/etcd && \ + rm -rf etcd-v3.5.0-linux-$TARGETARCH.tar.gz etcd-v3.5.0-linux-$TARGETARCH +ENV PATH=/usr/local/etcd:$PATH + +RUN wget https://dl.min.io/server/minio/release/linux-$TARGETARCH/minio --no-check-certificate && \ + chmod +x ./minio && \ + mv ./minio /usr/bin/ + +RUN git clone -b v${VERSION} https://github.com/milvus-io/milvus.git && \ + cd milvus/ && \ + CXXFLAGS="-I/usr/include/openblas" make milvus && \ + ln -s /usr/bin/milvus /milvus/bin/milvus \ No newline at end of file diff --git a/Database/milvus/README.md b/Database/milvus/README.md new file mode 100644 index 00000000..b1667ba2 --- /dev/null +++ b/Database/milvus/README.md @@ -0,0 +1,99 @@ +# Quick reference + +- The official milvus docker image. + +- Maintained by: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative). + +- Where to get help: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative), [openEuler](https://gitee.com/openeuler/community). + +# Milvus | openEuler +Current milvus docker images are built on the [openEuler](https://repo.openeuler.org/). This repository is free to use and exempted from per-user rate limits. + +Milvus is a high-performance vector database built for scale. It powers AI applications by efficiently organizing and searching vast amounts of unstructured data, such as text, images, and multi-modal information. + +Learn more about milvus at [https://milvus.io/](https://milvus.io/). + +# Supported tags and respective Dockerfile links +The tag of each `milvus` docker image is consist of the version of `milvus` and the version of basic image. The details are as follows +| Tag | Currently | Architectures | +|----------|-------------|------------------| +|[2.5.14-oe2403sp2](https://gitee.com/openeuler/openeuler-docker-images/blob/master/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile)| Milvus 2.5.14 on openEuler 24.03-LTS-SP2 | amd64, arm64 | + +# Usage + +- Step 1: Launch Milvus instance + ``` + docker run --name euler-milvus -it openeuler/milvus:latest + ``` +- Step 2: Start etcd + ``` + etcd --data-dir=/data/milvus/data/etcd-data/ & + ``` + The following message indicates that etcd is ready + ``` + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d received MsgPreVoteResp from 8e9e05c52164694d at term 1"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became candidate at term 2"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became leader at term 2"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","caller":"etcdserver/server.go:2476","msg":"setting up initial cluster version using v2 API","cluster-version":"3.5"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"membership/cluster.go:531","msg":"set initial cluster version","cluster-id":"cdf818194e3a8c32","local-member-id":"8e9e05c52164694d","cluster-version":"3.5"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"api/capability.go:75","msg":"enabled capabilities for version","cluster-version":"3.5"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"etcdserver/server.go:2500","msg":"cluster version is updated","cluster-version":"3.5"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"etcdserver/server.go:2027","msg":"published local member to cluster through raft","local-member-id":"8e9e05c52164694d","local-member-attributes":"{Name:default ClientURLs:[http://localhost:2379]}","request-path":"/0/members/8e9e05c52164694d/attributes","cluster-id":"cdf818194e3a8c32","publish-timeout":"7s"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"embed/serve.go:98","msg":"ready to serve client requests"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"etcdmain/main.go:47","msg":"notifying init daemon"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"etcdmain/main.go:53","msg":"successfully notified init daemon"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"embed/serve.go:140","msg":"serving client traffic insecurely; this is strongly discouraged!","address":"127.0.0.1:2379"} + ``` +- Step 3: Start MinIO + ``` + minio server /data/milvus/data/minio-data/ & + ``` + The following message indicates that MinIO is ready + ``` + Copyright: 2015-2025 MinIO, Inc. + License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html + Version: RELEASE.2025-06-13T11-33-47Z (go1.24.4 linux/amd64) + + API: http://172.17.0.4:9000 http://127.0.0.1:9000 + RootUser: minioadmin + RootPass: minioadmin + + WebUI: http://172.17.0.4:41483 http://127.0.0.1:41483 + RootUser: minioadmin + RootPass: minioadmin + + CLI: https://min.io/docs/minio/linux/reference/minio-mc.html#quickstart + $ mc alias set 'myminio' 'http://172.17.0.4:9000' 'minioadmin' 'minioadmin' + + Docs: https://docs.min.io + WARN: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables + ``` + +- Step 4: Start Milvus Standalone + ``` + milvus run standalone + ``` + The following message indicates that Milvus is ready + ``` + [2025/07/07 07:33:31.307 +00:00] [INFO] [distance/calc_distance_amd64.go:14] ["Hook avx for go simd distance computation"] + 2025/07/07 07:33:31 maxprocs: Leaving GOMAXPROCS=16: CPU quota undefined + + __ _________ _ ____ ______ + / |/ / _/ /| | / / / / / __/ + / /|_/ // // /_| |/ / /_/ /\ \ + /_/ /_/___/____/___/\____/___/ + + Welcome to use Milvus! + Version: 2.5.14 + Built: Mon Jul 7 07:32:02 UTC 2025 + GitCommit: 062fc368a5 + GoVersion: go version go1.24.2 linux/amd64 + + TotalMem: 66068840448 + UsedMem: 56733696 + ``` + +# Question and answering +If you have any questions or want to use some special features, please submit an issue or a pull request on [openeuler-docker-images](https://gitee.com/openeuler/openeuler-docker-images). \ No newline at end of file diff --git a/Database/milvus/doc/image-info.yml b/Database/milvus/doc/image-info.yml new file mode 100644 index 00000000..009453d8 --- /dev/null +++ b/Database/milvus/doc/image-info.yml @@ -0,0 +1,104 @@ +name: milvus +category: database +description: Milvus是业界领先的一种高性能、高扩展性的向量数据库,它提供强大的数据建模功能,使您能够将非结构化或多模式数据组织成结构化的Collections。它支持多种数据类型,适用于不同的属性模型。Milvus还支持业界多种先进的索引算法,用以提升在向量检索方面的查询效率。 +environment: | + 本应用在Docker环境中运行,安装Docker执行如下命令 + ``` + yum install -y docker + ``` +tags: | + milvus镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 + + | Tag | Currently | Architectures | + |----------|-------------|------------------| + |[2.7.11-oe2403sp1](https://gitee.com/openeuler/openeuler-docker-images/blob/master/Database/milvus/2.7.11/24.03-lts-sp1/Dockerfile)| milvus 2.7.11 on openEuler 24.03-LTS-SP1 | amd64, arm64 | + +download: | + 拉取镜像到本地 + ``` + docker pull openeuler/milvus:{Tag} + ``` + +usage: | + - Step 1: 启动Milvus实例 + ``` + docker run --name euler-milvus -it openeuler/milvus:latest + ``` + + - Step 2: 运行etcd + ``` + etcd --data-dir=/data/milvus/data/etcd-data/ & + ``` + 以下终端输出的信息表示etcd运行正常 + ``` + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d received MsgPreVoteResp from 8e9e05c52164694d at term 1"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became candidate at term 2"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became leader at term 2"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2"} + {"level":"info","ts":"2025-07-07T03:01:42.568Z","caller":"etcdserver/server.go:2476","msg":"setting up initial cluster version using v2 API","cluster-version":"3.5"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"membership/cluster.go:531","msg":"set initial cluster version","cluster-id":"cdf818194e3a8c32","local-member-id":"8e9e05c52164694d","cluster-version":"3.5"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"api/capability.go:75","msg":"enabled capabilities for version","cluster-version":"3.5"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"etcdserver/server.go:2500","msg":"cluster version is updated","cluster-version":"3.5"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"etcdserver/server.go:2027","msg":"published local member to cluster through raft","local-member-id":"8e9e05c52164694d","local-member-attributes":"{Name:default ClientURLs:[http://localhost:2379]}","request-path":"/0/members/8e9e05c52164694d/attributes","cluster-id":"cdf818194e3a8c32","publish-timeout":"7s"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"embed/serve.go:98","msg":"ready to serve client requests"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"etcdmain/main.go:47","msg":"notifying init daemon"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"etcdmain/main.go:53","msg":"successfully notified init daemon"} + {"level":"info","ts":"2025-07-07T03:01:42.570Z","caller":"embed/serve.go:140","msg":"serving client traffic insecurely; this is strongly discouraged!","address":"127.0.0.1:2379"} + ``` + - Step 3: 运行MinIO + ``` + minio server /data/milvus/data/minio-data/ & + ``` + 以下终端输出的信息表示MinIO运行正常 + ``` + Copyright: 2015-2025 MinIO, Inc. + License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html + Version: RELEASE.2025-06-13T11-33-47Z (go1.24.4 linux/amd64) + + API: http://172.17.0.4:9000 http://127.0.0.1:9000 + RootUser: minioadmin + RootPass: minioadmin + + WebUI: http://172.17.0.4:41483 http://127.0.0.1:41483 + RootUser: minioadmin + RootPass: minioadmin + + CLI: https://min.io/docs/minio/linux/reference/minio-mc.html#quickstart + $ mc alias set 'myminio' 'http://172.17.0.4:9000' 'minioadmin' 'minioadmin' + + Docs: https://docs.min.io + WARN: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables + ``` + + - Step 4: 运行单机Milvus + ``` + milvus run standalone + ``` + 以下终端输出的信息表示Milvus运行正常 + ``` + [2025/07/07 07:33:31.307 +00:00] [INFO] [distance/calc_distance_amd64.go:14] ["Hook avx for go simd distance computation"] + 2025/07/07 07:33:31 maxprocs: Leaving GOMAXPROCS=16: CPU quota undefined + + __ _________ _ ____ ______ + / |/ / _/ /| | / / / / / __/ + / /|_/ // // /_| |/ / /_/ /\ \ + /_/ /_/___/____/___/\____/___/ + + Welcome to use Milvus! + Version: 2.5.14 + Built: Mon Jul 7 07:32:02 UTC 2025 + GitCommit: 062fc368a5 + GoVersion: go version go1.24.2 linux/amd64 + + TotalMem: 66068840448 + UsedMem: 56733696 + ``` + + +license: Apache-2.0 license +similar_packages: + - N/A +dependency: + - N/A + \ No newline at end of file diff --git a/Database/milvus/doc/picture/logo.png b/Database/milvus/doc/picture/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..93668ab3260e85d03fdccfe9ad16db0ef5250bf6 GIT binary patch literal 31637 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 Date: Mon, 7 Jul 2025 15:59:46 +0800 Subject: [PATCH 2/6] add meta.yml --- Database/milvus/meta.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Database/milvus/meta.yml diff --git a/Database/milvus/meta.yml b/Database/milvus/meta.yml new file mode 100644 index 00000000..fe20e024 --- /dev/null +++ b/Database/milvus/meta.yml @@ -0,0 +1,2 @@ +2.5.14-oe2403sp2: + path: 2.5.14/24.03-lts-sp2/Dcokerfile \ No newline at end of file -- Gitee From 5155a7af473de0201c24d3f82930635b7651cd8b Mon Sep 17 00:00:00 2001 From: wjunLu Date: Mon, 7 Jul 2025 16:31:11 +0800 Subject: [PATCH 3/6] add image-list --- Database/image-list.yml | 3 ++- Database/milvus/doc/image-info.yml | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Database/image-list.yml b/Database/image-list.yml index e163fb72..63f0dba0 100644 --- a/Database/image-list.yml +++ b/Database/image-list.yml @@ -16,4 +16,5 @@ images: mariadb: mariadb tidb: tidb neo4j: neo4j - oceanbase: oceanbase \ No newline at end of file + oceanbase: oceanbase + milvus: milvus \ No newline at end of file diff --git a/Database/milvus/doc/image-info.yml b/Database/milvus/doc/image-info.yml index 009453d8..0cbf33cf 100644 --- a/Database/milvus/doc/image-info.yml +++ b/Database/milvus/doc/image-info.yml @@ -94,7 +94,6 @@ usage: | TotalMem: 66068840448 UsedMem: 56733696 ``` - license: Apache-2.0 license similar_packages: -- Gitee From ad9b16455add511275e2943654dd351ba0e58f0c Mon Sep 17 00:00:00 2001 From: wjunLu Date: Mon, 7 Jul 2025 17:46:08 +0800 Subject: [PATCH 4/6] fix --- Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile b/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile index 20444092..defade75 100644 --- a/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile +++ b/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile @@ -6,9 +6,9 @@ ARG GOLANG_VERSION=1.21.10 ARG TARGETARCH RUN yum install -y \ - sudo vim wget gcc g++ cmake make git \ - gfortran zip unzip libatomic numa* ninja* libstdc* \ - python3-pip openblas-devel && \ + sudo vim wget gcc g++ cmake make autoconf automake git which \ + gfortran zip unzip libatomic texinfo numa* ninja* libstdc* pkg-config libuuid-devel \ + python3-pip openblas-devel libaio perl-IPC-Cmd libasan libomp hdf5 hdf5-devel gtest-devel && \ yum clean all && \ wget -O go.tar.gz https://golang.google.cn/dl/go${GOLANG_VERSION}.linux-${TARGETARCH}.tar.gz && \ tar -xvf go.tar.gz -C /usr/local && \ @@ -16,7 +16,8 @@ RUN yum install -y \ ENV PATH=/usr/local/go/bin:$PATH RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain=1.73 -y && \ - pip install conan==1.61.0 + pip install conan==1.61.0 && \ + conan remote add tuna https://mirrors.tuna.tsinghua.edu.cn/conan/ ENV PATH=/root/.cargo/bin:$PATH RUN wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-$TARGETARCH.tar.gz --no-check-certificate && \ -- Gitee From 50a5977151c6e6b2e108a00449095852b5fe216f Mon Sep 17 00:00:00 2001 From: wjunLu Date: Tue, 8 Jul 2025 08:48:21 +0800 Subject: [PATCH 5/6] fix --- Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile b/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile index defade75..eb089092 100644 --- a/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile +++ b/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile @@ -6,9 +6,9 @@ ARG GOLANG_VERSION=1.21.10 ARG TARGETARCH RUN yum install -y \ - sudo vim wget gcc g++ cmake make autoconf automake git which \ + sudo vim wget gcc g++ cmake make git which \ gfortran zip unzip libatomic texinfo numa* ninja* libstdc* pkg-config libuuid-devel \ - python3-pip openblas-devel libaio perl-IPC-Cmd libasan libomp hdf5 hdf5-devel gtest-devel && \ + python3-pip openblas-devel libaio perl-IPC-Cmd libasan libomp hdf5 hdf5-devel && \ yum clean all && \ wget -O go.tar.gz https://golang.google.cn/dl/go${GOLANG_VERSION}.linux-${TARGETARCH}.tar.gz && \ tar -xvf go.tar.gz -C /usr/local && \ @@ -32,5 +32,9 @@ RUN wget https://dl.min.io/server/minio/release/linux-$TARGETARCH/minio --no-che RUN git clone -b v${VERSION} https://github.com/milvus-io/milvus.git && \ cd milvus/ && \ - CXXFLAGS="-I/usr/include/openblas" make milvus && \ + ./scripts/install_deps.sh + +RUN cd /milvus/ && \ + CXXFLAGS="-I/usr/include/openblas" make build-cpp && \ + make build-go && \ ln -s /usr/bin/milvus /milvus/bin/milvus \ No newline at end of file -- Gitee From d193e1798d9d24d5642d3ead1d7e6c97287fc41c Mon Sep 17 00:00:00 2001 From: wjunLu Date: Tue, 8 Jul 2025 20:16:15 +0800 Subject: [PATCH 6/6] reduce image size --- .../milvus/2.5.14/24.03-lts-sp2/Dockerfile | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile b/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile index eb089092..b0769b78 100644 --- a/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile +++ b/Database/milvus/2.5.14/24.03-lts-sp2/Dockerfile @@ -1,8 +1,8 @@ ARG BASE=openeuler/openeuler:24.03-lts-sp2 -FROM ${BASE} +FROM ${BASE} AS builder ARG VERSION=2.5.14 -ARG GOLANG_VERSION=1.21.10 +ARG GOLANG_VERSION=1.24.2 ARG TARGETARCH RUN yum install -y \ @@ -16,25 +16,39 @@ RUN yum install -y \ ENV PATH=/usr/local/go/bin:$PATH RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain=1.73 -y && \ - pip install conan==1.61.0 && \ - conan remote add tuna https://mirrors.tuna.tsinghua.edu.cn/conan/ + pip install conan==1.61.0 ENV PATH=/root/.cargo/bin:$PATH -RUN wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-$TARGETARCH.tar.gz --no-check-certificate && \ +RUN git clone -b v${VERSION} https://github.com/milvus-io/milvus.git && \ + cd milvus/ && \ + ./scripts/install_deps.sh && \ + CXXFLAGS="-I/usr/include/openblas" make build-cpp && \ + make build-go + + +FROM openeuler/openeuler:24.03-lts-sp2 + +ARG TARGETARCH + +RUN yum install -y libatomic openblas-devel libomp libstdc++ && \ + yum clean all + +RUN curl -fSL -o etcd-v3.5.0-linux-$TARGETARCH.tar.gz https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-$TARGETARCH.tar.gz && \ tar zxvf etcd-v3.5.0-linux-$TARGETARCH.tar.gz && \ cp -r etcd-v3.5.0-linux-$TARGETARCH /usr/local/etcd && \ rm -rf etcd-v3.5.0-linux-$TARGETARCH.tar.gz etcd-v3.5.0-linux-$TARGETARCH ENV PATH=/usr/local/etcd:$PATH -RUN wget https://dl.min.io/server/minio/release/linux-$TARGETARCH/minio --no-check-certificate && \ +RUN curl -fSL -o minio https://dl.min.io/server/minio/release/linux-$TARGETARCH/minio && \ chmod +x ./minio && \ mv ./minio /usr/bin/ -RUN git clone -b v${VERSION} https://github.com/milvus-io/milvus.git && \ - cd milvus/ && \ - ./scripts/install_deps.sh +WORKDIR /milvus -RUN cd /milvus/ && \ - CXXFLAGS="-I/usr/include/openblas" make build-cpp && \ - make build-go && \ - ln -s /usr/bin/milvus /milvus/bin/milvus \ No newline at end of file +COPY --from=builder /milvus/internal/core/output/lib64/ /milvus/lib64/ +COPY --from=builder /milvus/internal/core/output/lib/*.so* /milvus/lib/ +COPY --from=builder /milvus/configs /milvus/configs +COPY --from=builder /milvus/bin/ /milvus/bin/ + +ENV LD_LIBRARY_PATH=/milvus/lib:/milvus/lib64:/lib64 +ENV PATH=$PATH:/milvus/bin/ \ No newline at end of file -- Gitee