如何解决Docker容器内node_modules无法复制到构建主机的问题?
解决Docker容器内node_modules无法复制回主机的问题
嘿,我一眼就看出问题出在哪了——你把Docker的COPY指令方向搞反啦!
问题根源
Dockerfile里的COPY指令是从你的主机本地文件系统复制文件/目录到容器镜像中,而你写的COPY node_modules ./dashboard-interface/node_modules,是试图把主机上的node_modules复制到容器里,但此时主机上根本还没有这个目录(你本来想在容器里生成后再拿回来),所以Docker自然会报错找不到文件。
要把容器里生成的node_modules复制回主机,不能在Dockerfile里做,得换个思路。
正确解决方案
步骤1:修改Dockerfile,只负责安装依赖
先把Dockerfile里最后那个错误的COPY删掉,让它只完成在容器内安装node_modules的工作:
FROM node:9 # Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # Install app dependencies COPY ./dashboard-interface/package.json /usr/src/app/ RUN npm install --silent --production
步骤2:构建镜像
执行命令构建这个用于安装依赖的镜像:
docker build -t node-modules-builder .
步骤3:把容器内的node_modules复制回主机
有两种简单的方式可以实现:
方式一:用临时容器+挂载目录复制
这条命令会启动一个临时容器,把主机的dashboard-interface目录挂载到容器内,然后直接把容器里的node_modules复制到挂载的目录中,完成后自动删除容器:
docker run --rm -v $(pwd)/dashboard-interface:/host-dir node-modules-builder cp -r /usr/src/app/node_modules /host-dir/
方式二:用docker cp命令复制
如果觉得挂载目录有点复杂,也可以先启动一个后台容器,再用docker cp复制文件:
# 启动一个后台临时容器 docker run -d --name temp-node-container node-modules-builder sleep infinity # 把容器内的node_modules复制到主机目标目录 docker cp temp-node-container:/usr/src/app/node_modules ./dashboard-interface/ # 复制完成后删除临时容器 docker rm -f temp-node-container
这样操作之后,你主机上的./dashboard-interface/node_modules就会有容器里安装好的依赖包了,后续CI流程就能直接使用啦。
内容的提问来源于stack exchange,提问作者chinds




