Docker容器内大型Ember项目构建缓慢甚至停滞的问题求助
问题描述
我正尝试将本地开发环境Docker化,目的是简化新开发者入职流程,确保全员使用统一的本地环境。但目前遇到构建性能瓶颈:大型Ember应用(包含数百个组件)的构建编译过程会中途停滞,无法完成;但用小型示例Ember应用测试时无此问题,且在主机机器上构建完全正常,仅容器内速度极慢甚至卡死。
环境信息
- 主机:M3 Mac Pro,12核CPU,18GB可用内存
- Podman配置:默认机器分配12核CPU、12GB内存,未限制单个容器资源
当前使用的Dockerfile
# BASE IMAGE Amazon Linux:2 FROM amazonlinux:2 # Set up workdir ENV APP_DIR /app WORKDIR $APP_DIR VOLUME [$APP_DIR] # INSTALL dependencies RUN yum update -y && \ yum install -y git sudo wget curl cups-libs && \ yum groupinstall -y "Development Tools" && \ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash - && \ yum install -y nodejs python-devel openssl-devel && \ yum clean all && rm -rf /var/cache/yum # INSTALL Google chrome stable RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm && \ yum install -y ./google-chrome-stable_current_x86_64.rpm && \ yum clean all && rm -rf /var/cache/yum # INSTALL NVM and Ember CLI RUN wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash && source /root/.nvm/nvm.sh && \ nvm install 12.16.3 && \ npm install ember-cli@3.8.3 -g RUN echo 'source /root/.nvm/nvm.sh && nvm use 12.16.3' >> /root/.bashrc # install watchman RUN git clone https://github.com/facebook/watchman.git && \ cd watchman && \ git stash && \ git checkout -f v4.9.0 && \ ./autogen.sh && \ ./configure && \ make && \ make install RUN /bin/bash -c "if ! yarn --version >/dev/null 2>&1; then npm install -g yarn; fi && source /root/.nvm/nvm.sh && nvm use 12.16.3" && \ yarn global add bower && \ echo '{ "allow_root": true }' > /root/.bowerrc EXPOSE 4200 7153 CMD ["bash"]
容器内top命令输出
Tasks: 274 total, 2 running, 272 sleeping, 0 stopped, 0 zombie %Cpu(s): 8.3 us, 0.0 sy, 0.0 ni, 91.6 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st MiB Mem : 11924.1 total, 5362.0 free, 5765.5 used, 1022.6 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 6158.6 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4262 root 20 0 11.1g 4.4g 34964 R 99.7 37.5 6:09.23 ember 1 root 20 0 77288 27420 10764 S 0.0 0.2 0:00.03 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
备注:我试过用CI流水线的Dockerfile(用于PR单元测试),同样出现构建缓慢且无法完成的情况,怀疑是mac osxfs的问题?
解决方案建议
解决文件系统性能瓶颈:Mac上容器绑定挂载主机目录时,osxfs确实会在大量文件读写场景(比如Ember遍历数百个组件编译)下出现性能问题,可尝试:
- 先将代码
COPY进容器内构建,避免跨文件系统的频繁IO;如果需要开发热重载,改用Podman的:delegated挂载选项,减少主机与容器的文件同步开销 - 升级到最新版Podman,新版本对Mac文件系统的兼容性和性能有优化
- 先将代码
精简Dockerfile减少冗余:
- 移除重复的Node安装:当前Dockerfile同时安装了Node14和Node12.16.3,冗余且易导致环境冲突,保留nvm安装方式即可
- 合并RUN指令减少镜像层数,利用缓存机制避免重复下载安装包
优化Ember构建配置:
- 关闭不必要的调试插件或选项,减少编译时的IO和CPU消耗
- 开启并行构建:在
ember build命令中添加--parallel参数,充分利用多核心CPU资源
调整内存与Swap配置:给Podman机器开启Swap分区,避免Ember编译时因虚拟内存不足导致进程停滞
更换轻量基础镜像:Amazon Linux 2环境较重,改用Node官方镜像(比如
node:12.16.3-alpine),镜像体积更小、环境更精简,减少系统开销
内容的提问来源于stack exchange,提问作者RGog
相关产品推荐
相关产品推荐

