Docker构建时NPM命令未执行问题求助
容器构建后NPM命令未自动执行的问题排查
我执行docker-compose up app gulp启动服务,但容器启动后找不到NPM相关目录,仿佛npm install从未执行。手动进入容器执行该命令却能正常生成node_modules文件夹。
docker-compose.yml 配置
app: image: app_image container_name: myapp_app build: context: . dockerfile: _docker/app.Dockerfile volumes: - .:/var/www/html:delegated restart: always tty: true networks: - laravel gulp: container_name: myapp_gulp build: context: . dockerfile: _docker/gulp.Dockerfile tty: true volumes: - .:/var/www/html:delegated networks: - laravel
gulp.Dockerfile 内容
FROM public.ecr.aws/ubuntu/ubuntu:18.04_stable RUN apt-get update --allow-releaseinfo-change RUN apt-get install -y build-essential RUN apt-get install -y python2.7 ENV NODE_VERSION=11.15.0 RUN apt-get install -y curl RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash ENV NVM_DIR=/root/.nvm RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION} RUN . "$NVM_DIR/nvm.sh" && nvm use v${NODE_VERSION} RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION} ENV PATH="/root/.nvm/versions/node/v${NODE_VERSION}/bin/:${PATH}" WORKDIR /var/www/html/_mytheme/tools COPY . /var/www/html/ RUN npm install --python=python2.7 RUN npm i -y -g gulp@3.9.1 --python=python2.7 RUN npm i -y gulp@3.9.1 --python=python2.7 RUN npm link gulp RUN npm rebuild node-sass --python=python2.7 RUN npm i -g yarn --python=python2.7 RUN yarn install ENTRYPOINT ["tail"] CMD ["-f", "/dev/null"]
原因分析与解决办法
核心原因
本地卷挂载覆盖容器目录
Dockerfile中RUN npm install在容器内的/var/www/html/_mytheme/tools生成了node_modules,但docker-compose.yml将本地当前目录挂载到容器的/var/www/html。如果本地目录没有node_modules,挂载后会直接覆盖容器内已生成的该目录,导致看起来命令未执行。COPY与RUN顺序错误
Dockerfile中先设置WORKDIR,再执行COPY . /var/www/html/,这会把本地目录内容复制到容器对应路径,可能覆盖掉npm install生成的依赖文件。
解决办法
调整卷挂载策略
- 避免挂载整个
/var/www/html,只挂载需要实时更新的代码目录(如- ./src:/var/www/html/src),保留容器内的node_modules。 - 或者添加匿名卷排除
node_modules,修改gulp服务的volumes配置:volumes: - .:/var/www/html:delegated - /var/www/html/_mytheme/tools/node_modules
- 避免挂载整个
优化Dockerfile命令顺序
先复制依赖配置文件,执行安装命令,最后复制整个项目内容,既利用Docker缓存,又避免覆盖依赖:
WORKDIR /var/www/html/_mytheme/tools # 先复制依赖配置文件 COPY ./package.json ./yarn.lock /var/www/html/_mytheme/tools/ RUN npm install --python=python2.7 RUN npm i -y -g gulp@3.9.1 --python=python2.7 RUN npm i -y gulp@3.9.1 --python=python2.7 RUN npm link gulp RUN npm rebuild node-sass --python=python2.7 RUN npm i -g yarn --python=python2.7 RUN yarn install # 最后复制项目全部内容 COPY . /var/www/html/
- 验证构建过程
执行docker-compose build --no-cache gulp重新构建镜像,查看构建日志确认npm install等命令是否正常执行。
内容的提问来源于stack exchange,提问作者anderlaini
相关产品推荐
相关产品推荐

