Skip to content

Commit 18027d1

Browse files
committed
Refactor and Add ARM Support
1 parent c769398 commit 18027d1

2 files changed

Lines changed: 85 additions & 60 deletions

File tree

Dockerfile

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,48 @@
1-
ARG NODE_VERSION=latest
1+
# 显式指定 Node.js LTS 版本(建议固定如 20/18,避免版本波动,ARM 架构需匹配官方支持版本)
2+
ARG NODE_VERSION=20
23

4+
# 基于官方 Node 多架构镜像(slim 版轻量,自动适配 ARM/x86,无需额外配置架构)
35
FROM node:${NODE_VERSION}-slim
46

5-
# system local config
6-
RUN true \
7-
&& ln -sf /usr/share/zoneinfo/PRC /etc/localtime
8-
9-
RUN apt-get update \
10-
&& apt-get install -y \
11-
# 命令行工具
12-
zsh curl wget vim git
13-
7+
# 1. 配置时区(避免时间相关问题,无额外依赖)
8+
RUN ln -sf /usr/share/zoneinfo/PRC /etc/localtime
9+
10+
# 2. 安装核心工具集(curl/wget/vim/git/zsh)+ 清理缓存(修复注释位置:注释需在续接符 \ 之前)
11+
RUN apt-get update && \
12+
apt-get install -y --no-install-recommends \
13+
curl \
14+
wget \
15+
vim \
16+
git \
17+
zsh && \
18+
apt-get clean && \
19+
rm -rf /var/lib/apt/lists/*
20+
21+
# 3. 安装 oh-my-zsh(zsh 扩展工具,使用官方脚本,适配 ARM 架构)
22+
# 注:|| true 避免脚本中非致命错误导致构建失败(如提示 Shell 切换)
1423
RUN wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh || true
1524

16-
25+
# 4. 配置三大包管理工具 + 国内源(核心需求,确保 ARM 环境依赖拉取加速)
1726
RUN true \
18-
# npm china mirrors
19-
&& npm config set registry https://registry.npmmirror.com || true \
20-
# fix yarn permission denied https://github.com/nodejs/docker-node/issues/661
21-
&& chmod a+x /usr/local/bin/yarn \
22-
# yarn china mirrors https://github.com/nodejs/docker-node/issues/386
23-
&& yarn config set registry https://registry.npmmirror.com || true \
24-
# install pnpm
25-
&& npm install -g pnpm \
26-
&& pnpm config set registry https://registry.npmmirror.com || true
27-
28-
RUN apt-get clean autoclean
29-
30-
RUN mkdir /workspace
31-
27+
# npm 配置 npmmirror 国内源
28+
&& npm config set registry https://registry.npmmirror.com || true \
29+
# 修复 yarn 权限问题(官方预安装 yarn 可能存在执行权限不足,ARM 环境同样适用)
30+
&& chmod a+x /usr/local/bin/yarn /usr/local/lib/node_modules/yarn/bin/yarn.js || true \
31+
# yarn 配置 npmmirror 国内源
32+
&& yarn config set registry https://registry.npmmirror.com || true \
33+
# 全局安装 pnpm(Node 官方镜像默认不含,通过 npm 内置命令安装,ARM 兼容)
34+
&& npm install -g pnpm || true \
35+
# pnpm 配置 npmmirror 国内源 + 优化存储(可选:减少重复依赖占用空间)
36+
&& pnpm config set registry https://registry.npmmirror.com || true \
37+
&& pnpm config set store-dir ~/.pnpm-store || true
38+
39+
# 5. 基础环境配置(工作目录+数据卷,方便开发时挂载本地代码)
40+
RUN mkdir -p /workspace
3241
WORKDIR /workspace
33-
3442
VOLUME /workspace
3543

44+
# 6. 暴露常用端口(如前端 8080/后端 3000,根据项目需求调整,仅为声明作用)
3645
EXPOSE 8080
3746

38-
CMD ["zsh"]
47+
# 7. 默认启动 zsh(符合工具集使用习惯,若需 bash 可改为 ["bash"])
48+
CMD ["zsh"]

build-image.sh

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#### halt script on error
44
set -xe
55

6+
# 1. 克隆代码(保持原逻辑)
67
git clone https://github.com/springjk/web-dev-docker.git
78
cd web-dev-docker
89

@@ -12,42 +13,56 @@ docker --version
1213
echo '##### Print environment'
1314
env | sort
1415

15-
16-
#### Build the Docker Images
17-
18-
echo build version is ${NODE_VERSION}
19-
20-
21-
docker build --build-arg NODE_VERSION=${NODE_VERSION} -t webdev .
22-
#####################################
23-
24-
# push to docker hub
25-
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
26-
27-
docker tag webdev:latest ${DOCKER_USERNAME}/webdev:latest
28-
29-
docker images
30-
31-
docker push ${DOCKER_USERNAME}/webdev
32-
16+
# 2. 定义关键变量(新增:指定需要支持的架构列表,如 ARM64 + x86_64)
17+
TARGET_ARCHITECTURES="linux/arm64,linux/amd64" # 多架构列表(arm64对应ARM,amd64对应x86_64)
18+
DOCKER_HUB_REPO="${DOCKER_USERNAME}/webdev" # Docker Hub 仓库地址
19+
ALIYUN_REPO="registry.cn-hangzhou.aliyuncs.com/${DOCKER_USERNAME}/webdev" # 阿里云仓库地址
20+
NODE_VERSION=${NODE_VERSION:-"latest"} # 默认Node版本为latest
21+
22+
echo "##### Build version: ${NODE_VERSION}, Target architectures: ${TARGET_ARCHITECTURES}"
23+
24+
# 3. 配置 Docker Buildx(启用多架构构建能力)
25+
# - 创建构建器实例(若不存在)
26+
# - 启用构建器(切换到多架构构建模式)
27+
docker buildx create --name multiarch-builder --use || true
28+
# 加载 qemu 模拟器(用于跨架构构建,如在x86机器上构建ARM镜像)
29+
docker run --privileged --rm tonistiigi/binfmt --install all
30+
31+
# 4. 多架构构建并推送至 Docker Hub(核心修改:用 buildx build --platform 指定多架构,--push 直接推送)
32+
# 推送 latest 标签(无论 Node 版本是否为 latest,都推送 latest 作为默认标签)
33+
docker buildx build \
34+
--platform "${TARGET_ARCHITECTURES}" \ # 指定多架构
35+
--build-arg NODE_VERSION="${NODE_VERSION}" \ # 传递 Node 版本参数
36+
-t "${DOCKER_HUB_REPO}:latest" \ # Docker Hub latest 标签
37+
--push . # 直接推送(无需本地 tag,Buildx 会自动处理多架构镜像索引)
38+
39+
# 若 Node 版本不是 latest/NA,额外推送版本标签(如 webdev:20)
3340
if [[ ${NODE_VERSION} != "latest" && ${NODE_VERSION} != "NA" ]]; then
34-
# push build version
35-
docker tag ${DOCKER_USERNAME}/webdev:latest ${DOCKER_USERNAME}/webdev:${NODE_VERSION}
36-
docker push ${DOCKER_USERNAME}/webdev:${NODE_VERSION}
41+
docker buildx build \
42+
--platform "${TARGET_ARCHITECTURES}" \
43+
--build-arg NODE_VERSION="${NODE_VERSION}" \
44+
-t "${DOCKER_HUB_REPO}:${NODE_VERSION}" \ # 版本标签
45+
--push .
3746
fi
3847

48+
# 5. 多架构构建并推送至阿里云镜像仓库(逻辑与 Docker Hub 一致)
49+
docker buildx build \
50+
--platform "${TARGET_ARCHITECTURES}" \
51+
--build-arg NODE_VERSION="${NODE_VERSION}" \
52+
-t "${ALIYUN_REPO}:latest" \
53+
--push .
3954

40-
# push to aliyun docker hub
41-
echo "$ALIYUN_DOCKER_PASSWORD" | docker login -u "$ALIYUN_DOCKER_USERNAME" --password-stdin registry.cn-hangzhou.aliyuncs.com
42-
43-
docker tag webdev:latest registry.cn-hangzhou.aliyuncs.com/${DOCKER_USERNAME}/webdev:latest
44-
45-
docker images
55+
if [[ ${NODE_VERSION} != "latest" && ${NODE_VERSION} != "NA" ]]; then
56+
docker buildx build \
57+
--platform "${TARGET_ARCHITECTURES}" \
58+
--build-arg NODE_VERSION="${NODE_VERSION}" \
59+
-t "${ALIYUN_REPO}:${NODE_VERSION}" \
60+
--push .
61+
fi
4662

47-
docker push registry.cn-hangzhou.aliyuncs.com/${DOCKER_USERNAME}/webdev
63+
# 6. 验证推送结果(可选:查看仓库中的多架构镜像信息)
64+
echo "##### Check Docker Hub multi-arch image info"
65+
docker buildx imagetools inspect "${DOCKER_HUB_REPO}:latest"
4866

49-
if [[ ${NODE_VERSION} != "latest" && ${NODE_VERSION} != "NA" ]]; then
50-
# push build version
51-
docker tag ${DOCKER_USERNAME}/webdev:latest registry.cn-hangzhou.aliyuncs.com/${DOCKER_USERNAME}/webdev:${NODE_VERSION}
52-
docker push registry.cn-hangzhou.aliyuncs.com/${DOCKER_USERNAME}/webdev:${NODE_VERSION}
53-
fi
67+
echo "##### Check Aliyun multi-arch image info"
68+
docker buildx imagetools inspect "${ALIYUN_REPO}:latest"

0 commit comments

Comments
 (0)