一、基于源码构建 Redis Insight openEuler Arm64 镜像

创建一个shell文件

#!/bin/bash
set -e  # 添加错误处理

imageTag=redisinsight-openeuler:3.0.0

if [ ! -f "RedisInsight.zip" ]; then
    echo "下载 RedisInsight 源码包..."
    if ! curl -L -f \
    --retry 3 \
    -H 'User-Agent: Mozilla/5.0' \
    -o RedisInsight.zip \
    "https://github.com/redis/RedisInsight/archive/refs/heads/main.zip"; then
        echo "错误:RedisInsight 源码包下载失败"
        exit 1
    fi
fi

# 2. 设置环境变量
export DOCKER_BUILDKIT=1
export DOCKER_CLI_EXPERIMENTAL=enabled

BUILDER_NAME="mybuilder"

# 3. 清理和设置构建器
echo "设置 Docker Buildx 构建器..."
rm -rf /tmp/buildkitd.toml
cat > /tmp/buildkitd.toml << 'EOF'
debug = true
root = "/var/lib/buildkit"
[registry."docker.io"]
  mirrors = [
  		"https://e2zfh98i.mirror.aliyuncs.com",
  		"https://mirror.baidubce.com",
  		"https://docker.mirrors.ustc.edu.cn",
  		"https://docker-cf.registry.cyou",
  		"https://dockercf.jsdelivr.fyi",
  		"https://docker.jsdelivr.fyi",
  		"https://dockertest.jsdelivr.fyi",
  		"https://dockerproxy.com",
  		"https://docker.m.daocloud.io",
  		"https://docker.nju.edu.cn",
  		"https://docker.mirrors.sjtug.sjtu.edu.cn",
  		"https://mirror.iscas.ac.cn",
  		"https://docker.rainbond.cc",
  		"https://do.nark.eu.org",
  		"https://dc.j8.work",
  		"https://dockerproxy.com",
  		"https://gst6rzl9.mirror.aliyuncs.com",
  		"https://registry.docker-cn.com",
  		"http://hub-mirror.c.163.com",
  		"http://mirrors.ustc.edu.cn/",
  		"https://mirrors.tuna.tsinghua.edu.cn/",
  		"http://mirrors.sohu.com/"
	]
EOF

# 检查并创建构建器
if ! docker buildx inspect $BUILDER_NAME >/dev/null 2>&1; then
    echo "创建构建器: $BUILDER_NAME"
    
    docker buildx create \
        --name $BUILDER_NAME \
        --driver docker-container \
        --driver-opt "image=moby/buildkit:master" \
        --platform linux/arm64 \
        --config /tmp/buildkitd.toml \
        --use
else
    echo "构建器已存在: $BUILDER_NAME"
    docker buildx use $BUILDER_NAME
fi

# 启动构建器
docker buildx inspect --bootstrap


# 4. 创建正确的 Dockerfile
echo "创建 Dockerfile..."
cat > Dockerfile << 'EOF'
# 使用华为云镜像源
FROM openeuler/openeuler:24.03-lts-sp3 AS builder

# 设置参数
ARG TARGETARCH
ARG TARGETPLATFORM
RUN echo "目标架构: $TARGETARCH, 目标平台: $TARGETPLATFORM"

ENV NODE_VERSION=v24.12.0
ENV NODE_HOME=/app/node-${NODE_VERSION}-linux-arm64
ENV PATH=$NODE_HOME/bin:$PATH
ENV TZ=Asia/Shanghai

# 安装编译和构建依赖
RUN dnf install -y gcc gcc-c++ make cmake git wget vim tar xz zip unzip expect libsecret libsecret-devel && dnf clean all

RUN mkdir -p /app
WORKDIR /app

# 下载 node
RUN wget -O node-${NODE_VERSION}-linux-arm64.tar.xz https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-arm64.tar.xz \
&& xz -dq node-${NODE_VERSION}-linux-arm64.tar.xz \
&& tar -xf node-${NODE_VERSION}-linux-arm64.tar

RUN node -v && npm -v
# 设置为国内源
RUN npm config set registry https://registry.npmmirror.com && npm install -g yarn
RUN yarn --version && yarn config set registry https://registry.npmmirror.com

# 设置工作目录
WORKDIR /app

# 下载 RedisInsight 源码
COPY RedisInsight.zip /app/
RUN unzip -q RedisInsight.zip && mv -f RedisInsight-main RedisInsight

# npm 国内源加速
ENV ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
ENV ELECTRON_BUILDER_BINARIES_MIRROR="https://npmmirror.com/mirrors/electron-builder-binaries/"
ENV npm_config_electron_mirror="https://npmmirror.com/mirrors/electron/"

# 清除旧的 .npmrc 配置以避免冲突
RUN rm -f ~/.npmrc

WORKDIR /app/RedisInsight
#安装依赖
RUN unbuffer yarn install
#安装api依赖
RUN unbuffer yarn --cwd /app/RedisInsight/redisinsight/api install
#构建web ui资源
RUN unbuffer yarn build:ui
RUN unbuffer yarn build:statics
RUN unbuffer yarn build:api
#构建生产
RUN unbuffer yarn --cwd /app/RedisInsight/redisinsight/api install --production


# 第二阶段:最终镜像
FROM openeuler/openeuler:24.03-lts-sp3

# 设置参数
ENV REDISINSIGHT_HOME=/app/RedisInsight
ENV NODE_VERSION=v24.12.0
ENV NODE_HOME=/app/node-${NODE_VERSION}-linux-arm64
ENV PATH=$NODE_HOME/bin:$PATH
ENV TZ=Asia/Shanghai
ENV LANG=zh_CN.utf8

# 设置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 安装运行时依赖
RUN dnf install -y libsecret libsecret-devel shadow-utils && dnf clean all

# 创建 node 用户和组
RUN groupadd -r node -g 1000 && \
    useradd -r -u 1000 -g node -d /home/node -m node

# 从构建阶段复制 MySQL
COPY --from=builder ${NODE_HOME} ${NODE_HOME}
COPY --from=builder ${REDISINSIGHT_HOME}/redisinsight/api/dist ${REDISINSIGHT_HOME}/redisinsight/api/dist
COPY --from=builder ${REDISINSIGHT_HOME}/redisinsight/api/node_modules ${REDISINSIGHT_HOME}/redisinsight/api/node_modules
COPY --from=builder ${REDISINSIGHT_HOME}/redisinsight/ui/dist ${REDISINSIGHT_HOME}/redisinsight/ui/dist

# 复制配置文件
COPY docker-entrypoint.sh /usr/local/bin/

# 设置权限
RUN chmod +x /usr/local/bin/docker-entrypoint.sh 
RUN chown -R node:node /usr/local/bin/docker-entrypoint.sh 

RUN chown -R node:node ${NODE_HOME}
RUN chown -R node:node ${REDISINSIGHT_HOME}

# 验证架构
RUN echo "Building for architecture: $(uname -m)"

# 暴露端口
EXPOSE 5540

USER node

# 设置工作目录
WORKDIR ${REDISINSIGHT_HOME}

ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh", "/app/node-v24.12.0-linux-arm64/bin/node", "/app/RedisInsight/redisinsight/api/dist/src/main"]
EOF


# 5. 创建启动脚本
echo "创建启动脚本..."
cat > docker-entrypoint.sh << 'EOF'
#!/bin/bash
set -e
echo "启动 RedisInsight..."
exec "$@"
EOF

chmod +x docker-entrypoint.sh

# 6. 构建镜像(添加错误处理)
echo "开始构建镜像..."
# 构建镜像
if docker buildx build \
  --platform linux/arm64 \
  -t ${imageTag} \
  --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
  --load \
  --progress=plain \
  .; then
    echo "✅ 镜像构建成功: ${imageTag}"
else
    echo "❌ 错误: 镜像构建失败" >&2
    exit 1
fi

二、基于源码构建 Redis Insight Alpine Arm64 镜像

创建一个shell文件

#!/bin/bash
set -e  # 添加错误处理

if [ ! -f "RedisInsight.zip" ]; then
    echo "下载 RedisInsight 源码包..."
    if ! curl -L -f \
    --retry 3 \
    -H 'User-Agent: Mozilla/5.0' \
    -o RedisInsight.zip \
    "https://github.com/redis/RedisInsight/archive/refs/heads/main.zip"; then
        echo "错误:RedisInsight 源码包下载失败"
        exit 1
    fi
fi

imageTag=redisinsight-alpine:3.0.0

# 2. 设置环境变量
export DOCKER_BUILDKIT=1
export DOCKER_CLI_EXPERIMENTAL=enabled

BUILDER_NAME="mybuilder"

# 检查并创建构建器
if ! docker buildx inspect $BUILDER_NAME >/dev/null 2>&1; then
    echo "创建构建器: $BUILDER_NAME"
    
    docker buildx create \
        --name $BUILDER_NAME \
        --driver docker-container \
        --driver-opt "image=moby/buildkit:master" \
        --platform linux/arm64 \
        --config /tmp/buildkitd.toml \
        --use
else
    echo "构建器已存在: $BUILDER_NAME"
    docker buildx use $BUILDER_NAME
fi

# 启动构建器
docker buildx inspect --bootstrap

# 4. 创建基于 Alpine 的 Dockerfile
echo "创建 Alpine 版 Dockerfile..."
cat > Dockerfile << 'DOCKERFILE_EOF'
# 使用 Alpine Node.js 作为构建环境
FROM node:24-alpine3.20 AS builder

# 设置参数
ARG TARGETARCH
ARG TARGETPLATFORM
RUN echo "目标架构: $TARGETARCH, 目标平台: $TARGETPLATFORM"

# 设置时区和环境变量
ENV TZ=Asia/Shanghai
ENV REDISINSIGHT_HOME=/app/RedisInsight
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8

# 设置 Alpine 镜像源为国内源 - 使用清华源
RUN echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/main" > /etc/apk/repositories && \
    echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/community" >> /etc/apk/repositories

# 安装编译依赖
RUN apk add --no-cache \
    tzdata \
    git \
    curl \
    wget \
    bash \
    make \
    gcc \
    g++ \
    python3 \
    py3-pip \
    alpine-sdk \
    linux-headers \
    libc6-compat \
    libsecret-dev \
    expect \
    && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 设置 npm 和 yarn 国内源
RUN npm config set registry https://registry.npmmirror.com && \
    yarn config set registry https://registry.npmmirror.com

# 设置工作目录
WORKDIR /app

# 下载 RedisInsight 源码
COPY RedisInsight.zip /app/
RUN unzip -q RedisInsight.zip && \
    mv -f RedisInsight-main RedisInsight && \
    rm -f RedisInsight.zip

# 设置 Electron 镜像源
ENV ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
ENV ELECTRON_BUILDER_BINARIES_MIRROR="https://npmmirror.com/mirrors/electron-builder-binaries/"
ENV npm_config_electron_mirror="https://npmmirror.com/mirrors/electron/"

# 清除 npm 缓存和配置
RUN rm -rf ~/.npm ~/.cache && \
    rm -f ~/.npmrc

WORKDIR /app/RedisInsight
# 安装 root 依赖
RUN unbuffer yarn install --network-timeout 300000

# 安装 API 依赖
WORKDIR /app/RedisInsight/redisinsight/api
RUN unbuffer yarn install --network-timeout 300000

# 返回根目录
WORKDIR /app/RedisInsight

# 构建步骤
RUN unbuffer yarn build:ui && \
    unbuffer yarn build:statics && \
    unbuffer yarn build:api

# 构建生产依赖
RUN unbuffer yarn --cwd /app/RedisInsight/redisinsight/api install --production

# 清理构建缓存和开发依赖
RUN apk del --no-cache \
    make \
    gcc \
    g++ \
    python3 \
    py3-pip \
    alpine-sdk \
    linux-headers && \
    rm -rf /tmp/* /var/tmp/* /root/.cache /root/.npm && \
    find /app/RedisInsight/node_modules -name "*.md" -o -name "*.map" -o -name "test" -o -name "tests" | xargs rm -rf

# 第二阶段:生产镜像
FROM node:24-alpine3.20

# 设置参数
ENV REDISINSIGHT_HOME=/app/RedisInsight
ENV TZ=Asia/Shanghai
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8

# 设置时区和镜像源
RUN echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/main" > /etc/apk/repositories && \
    echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/community" >> /etc/apk/repositories && \
    apk add --no-cache tzdata && \
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
    echo $TZ > /etc/timezone && \
    rm -rf /var/cache/apk/*


# 创建非 root 用户 - 使用动态ID避免冲突
RUN mkdir -p /app && \
    chown -R node:node /app

# 安装运行时依赖
RUN apk add --no-cache \
    libsecret \
    curl \
    dumb-init

# 从构建阶段复制文件
COPY --from=builder --chown=node:node ${REDISINSIGHT_HOME}/redisinsight/api/dist ${REDISINSIGHT_HOME}/redisinsight/api/dist
COPY --from=builder --chown=node:node ${REDISINSIGHT_HOME}/redisinsight/api/node_modules ${REDISINSIGHT_HOME}/redisinsight/api/node_modules
COPY --from=builder --chown=node:node ${REDISINSIGHT_HOME}/redisinsight/ui/dist ${REDISINSIGHT_HOME}/redisinsight/ui/dist

# 复制配置文件
COPY --chown=node:node docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

# 设置 npm 国内源
RUN npm config set registry https://registry.npmmirror.com

# 设置工作目录
WORKDIR ${REDISINSIGHT_HOME}

# 验证架构
RUN echo "镜像架构: $(uname -m)"
RUN echo "Node 版本: $(node --version)"
RUN echo "NPM 版本: $(npm --version)"

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:5540/health || exit 1

# 暴露端口
EXPOSE 5540

# 切换到非 root 用户
USER node

ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh", "node", "/app/RedisInsight/redisinsight/api/dist/src/main"]

DOCKERFILE_EOF

# 5. 创建启动脚本
echo "创建启动脚本..."
cat > docker-entrypoint.sh << 'ENTRYPOINT_EOF'
#!/bin/sh
set -e

echo "=========================================="
echo "RedisInsight Alpine 版本启动中..."
echo "版本: 3.0.0"
echo "时区: ${TZ}"
echo "端口: 5540"
echo "=========================================="

# 检查必要目录是否存在
if [ ! -d "/app/RedisInsight/redisinsight/api/dist" ]; then
    echo "错误: RedisInsight 构建文件不存在!" >&2
    exit 1
fi

echo "启动 RedisInsight API 服务..."
echo "节点版本: $(node --version)"
echo "NPM 版本: $(npm --version)"

# 执行主命令
exec "$@"
ENTRYPOINT_EOF

chmod +x docker-entrypoint.sh

# 执行构建
if docker buildx build \
  --platform linux/arm64 \
  -t ${imageTag} \
  --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
  --load \
  --progress=plain \
  --no-cache \
  .; then
    echo "✅ 镜像构建成功: ${imageTag}"
else
    echo "❌ 错误: 镜像构建失败" >&2
    exit 1
fi
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐