x86 平台使用 Docker buildx 构建 Redis Insight Arm64 镜像
·
x86 平台使用 Docker buildx 构建 Redis Insight Arm64 镜像
一、基于源码构建 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
更多推荐


所有评论(0)