You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决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

火山引擎 最新活动