---
title: （可选）构建Docker镜像
description: "构建Docker镜像可以确保环境一致性、实现快速部署、提供容器间隔离性、简化依赖管理，并具备良好的可移植性和灵活性，使应用能够在任何安装了Docker的环境中高效运行。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/ecosystemEnable/Milvus/kunpeng_milv_ins_42_003.html
sourcePath: /source/zh/kunpengdbs/ecosystemEnable/Milvus/kunpeng_milv_ins_42_003.html
indexId: 82787c94958e87e1f5ce2bbed1816637617910af89fc57733371c4003c6e46e373
---
# （可选）构建Docker镜像

构建Docker镜像可以确保环境一致性、实现快速部署、提供容器间隔离性、简化依赖管理，并具备良好的可移植性和灵活性，使应用能够在任何安装了Docker的环境中高效运行。

本节为Milvus安装操作的补充，以openeuler-22.03-lts-sp4:latest镜像为基础，将Milvus安装方式写进Dockerfile中，以此构建Milvus Docker镜像。

1. 准备Docker环境。
  1 yum install docker

2. 准备基础镜像。
参考表2中的链接，下载基础Docker镜像，并将镜像导入。

  - ARM版本
    1 docker load -i openEuler-docker.aarch64.tar.xz

  - x86版本
    1 docker load -i openEuler-docker.x86_64.tar.xz

3. 准备Dockerfile。

  a. 创建并打开Dockerfile文件。
    1 vim Dockerfile

  b. 按“i”进入编辑模式并将以下内容粘贴到文件中。

```
FROM openeuler-22.03-lts-sp4:latest
ARG TARGETARCH
ARG CACHE_BUST
RUN echo "Cache busting with $CACHE_BUST"
# 根据系统类型获取架构
RUN echo "target arch ${TARGETARCH}"
# 安装依赖，包括python和openblas
RUN yum install -y wget g++ gcc gdb libatomic libstdc++-static ninja-build git make zip unzip tar which \
autoconf automake python3 python3-pip texinfo gfortran numa* libstdc* curl vim \
pkg-config libuuid-devel libaio perl-IPC-Cmd libasan openblas-devel libomp hdf5 hdf5-devel gtest-devel && \
yum clean all
# 配置Miniconda3
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-aarch64.sh -O miniconda.sh
RUN sh miniconda.sh -b && rm miniconda.sh
ENV PATH=/root/miniconda3/bin:$PATH
RUN conda config --set auto_activate_base false
# 配置pip镜像代理
RUN mkdir /root/.pip && \
echo -e "[global]\nindex-url=https://repo.huaweicloud.com/repository/pypi/simple\n[install]\ntrusted-host=repo.huaweicloud.com\n" >> /root/.pip/pip.conf
# 创建python虚拟环境
RUN conda create -y --name milvus python=3.11
# 下载python依赖conan
RUN conda init bash && source /root/.bashrc && conda activate milvus && pip install conan==1.61.0 && \
conan remote add conancenter https://center.conan.io False -f && \
conan remote add default-conan-local https://milvus01.jfrog.io/artifactory/api/conan/default-conan-local False -f && \
sed -i '32s/self._verify_ssl = verify/self._verify_ssl = False/' /root/miniconda3/envs/milvus/lib/python3.11/site-packages/conans/client/downloaders/file_downloader.py
# 下载安装cmake
RUN wget -qO- "https://cmake.org/files/v3.27/cmake-3.27.5-linux-`uname -m`.tar.gz" | tar --strip-components=1 -xz -C /usr/local
# 下载安装go
RUN mkdir /root/go && mkdir /usr/local/go && \
wget -qO- "https://repo.huaweicloud.com/go/go1.21.10/go1.21.10.linux-${TARGETARCH}.tar.gz" | tar --strip-components=1 -xz -C /usr/local/go
ENV GOROOT=/usr/local/go
ENV GOPATH=/root/go
ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH
ENV GO111MODULE=on
ENV GOPROXY=https://repo.huaweicloud.com/repository/goproxy/
ENV GOSUMDB=off
# 下载安装rust
RUN curl https://sh.rustup.rs -sSf | \
sh -s -- --default-toolchain=1.73 -y
ENV PATH=/root/.cargo/bin:$PATH
# 下载安装OpenBLAS
RUN mkdir OpenBLAS-0.3.10 && \
wget -qO- https://github.com/xianyi/OpenBLAS/archive/v0.3.10.tar.gz | tar --strip-components=1 -xz -C OpenBLAS-0.3.10
RUN cd OpenBLAS-0.3.10 && make FC=gfortran USE_OPENMP=1 -j && make install && \
cd .. && rm -rf OpenBLAS-0.3.10
ENV LD_LIBRARY_PATH=/opt/OpenBLAS/lib:$LD_LIBRARY_PATH
# 下载安装etcd
RUN mkdir /usr/local/etcd && \
wget -qO- "https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-${TARGETARCH}.tar.gz" | tar --strip-components=1 -xz -C /usr/local/etcd
ENV PATH=/usr/local/etcd:$PATH
# 下载安装minio
RUN wget -q "https://dl.min.io/server/minio/release/linux-${TARGETARCH}/minio" && chmod +x ./minio && mv ./minio /usr/bin/
# 下载milvus
RUN git clone https://github.com/milvus-io/milvus.git && \
cd /root/milvus && git checkout v2.4.5
```


    1.如果物理机所在网络环境无法直接访问外网，可在Dockerfile中增加代理配置，在添加FROM之后添加ENV配置代理信息，在文件最后清除代理信息。修改示例如下： FROM openeuler-22.03-lts-sp4:latest # 增加代理，连接外网 ENV http_proxy="http://代理服务用户名:代理服务密码@代理服务IP地址:代理服务端口" ENV https_proxy=$http_proxy ... ENV http_proxy="" ENV https_proxy="" 2.若是需要外部证书以防止连接被拒绝，可以将证书放在Dockerfile同一级目录，并将证书复制到正确路径。修改示例如下： ... RUN echo "Cache busting with $CACHE_BUST" # 根据系统类型获取架构 RUN echo "target arch ${TARGETARCH}" COPY certificate.crt /etc/pki/ca-trust/source/anchors/ RUN update-ca-trust ... 3.由于从GitHub上克隆Milvus可能花费很多时间，若是构建失败，则需要全部重新构建。可以先将Milvus准备好，放在Dockerfile同一级目录下，然后将其复制到镜像中。修改示例如下： ... # 下载安装minio RUN wget -q "https://dl.min.io/server/minio/release/linux-${TARGETARCH}/minio" && chmod +x ./minio && mv ./minio /usr/bin/ COPY milvus/ /root/milvus RUN cd /root/milvus && git checkout v2.4.5 ...

4. 构建镜像。
通过以下命令，开始通过Dockerfile文件构建镜像。

  - ARM
    1 docker build --no-cache --build-arg TARGETARCH=arm64 --build-arg CACHE_BUST=$(date +%s) -t openeuler-22.03-lts-sp4-milvus:latest .

  - x86
    1 docker build --no-cache --build-arg TARGETARCH=amd64 --build-arg CACHE_BUST=$(date +%s) -t openeuler-22.03-lts-sp4-milvus:latest .

5. 导出镜像。
  将构建好的镜像打包成本地磁盘上的tar包文件。

  1 docker save -o openeuler-22.03-lts-sp4-milvus.tar openeuler-22.03-lts-sp4-milvus:latest

6. 导入镜像。
  若是需要使用镜像，可以将其上传到相应的服务器中，然后将tar包导入到本地镜像仓库。 1 docker load -i openeuler-22.03-lts-sp4-milvus.tar

7. 创建容器。
  使用镜像运行一个容器实例，并以后台方式运行。命令中参数解释如表1 命令中的参数说明所示。

  1 docker run -d -it --cpus=16 --cpuset-cpus=0-15 --cpuset-mems=0 -m 64g --name milvus-16u64g-01 --network host --privileged=true -v /data/milvus:/data/milvus openeuler-22.03-lts-sp4-milvus /bin/bash

**表1 命令中的参数说明**

| 参数 | 参数含义 |
| --- | --- |
| \-d | 后台运行容器。 |
| \-it | i表示分配一个交互终端，t表示分配一个伪tty设备，可以支持终端登录。 |
| \-\-cpus=16 | 给容器分配16个CPU核。 |
| \-\-cpuset\-cpus=0\-15 | 绑定具体CPU核。 |
| \-\-cpuset\-mems=0 | 内存绑定配置，从NUMA0申请。 |
| \-m | 给容器分配多大的内存。 |
| \-\-name | 给容器起的名称。 |
| \-\-network host | 容器和主机共享网络。 |
| \-\-privileged=true | 使用root权限。 须知： 这个选项执行了以下两项操作：为容器添加了所有capabilities，并允许容器访问主机的所有设置。这意味着，在设置privileged = true的容器中，我们能够执行许多平时无法进行的操作，比如加载内核模块和直接操作硬件设备。然而，这一选项也带来了严重的安全隐患，可能使容器突破边界，对主机进行任意操作。 |
| \-v /data/milvus:/data/milvus | 表示文件挂载，Docker和主机共享的文件目录。 |
| openeuler\-22.03\-lts\-sp4 | 使用的镜像的名称。 |
| /bin/bash | 启动容器执行的命令。 |


8. 进入容器。
  进入容器后可以像在宿主机上一样操作。

  1 docker exec -it milvus-16u64g-01 /bin/bash


由于一些可能的故障需要编译一次Milvus之后才能通过生成配置文件进行修改，例如编译Milvus出现未找到GCC版本的解决方法，构建的镜像并没有进行Milvus的编译。在创建容器之后，需要进入容器中，通过以下命令进行编译，遇到问题则参考故障排除。

```
conda activate milvus
cd /root/milvus
make milvus
```
