繁体   English   中英

如何将 node_modules 文件夹从我的 docker 容器复制到构建机器上?

[英]How can I copy node_modules folder out of my docker container onto the build machine?

我正在将应用程序移动到新的构建管道。 在 CI 上,我无法安装节点来完成 NPM 安装步骤。

我的想法是将 npm install 步骤移动到使用 Node 的 Docker 映像,安装节点模块,然后将节点模块复制回主机,以便另一个进程可以打包应用程序。

这是我的 Dockerfile:

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

# Bundle app src
COPY node_modules ./dashboard-interface/node_modules #I thought this would copy the new node_modules back to the host

这运行良好并安装节点模块,但是当我尝试将 node_modules 目录复制回主机时,我看到一条错误消息:

COPY node_modules ./dashboard-interface/node_modules
COPY failed: stat /var/lib/docker/tmp/docker-builder718557240/node_modules: no such file or directory

所以很明显,复制过程也找不到它刚刚安装节点模块的node_modules目录。

根据COPY 指令文档,COPY 指令将文件从主机复制到容器。

如果您希望容器中的文件在容器外可用,则可以使用Volumes Volumes 将帮助您为您的容器提供一个独立于容器本身的存储,因此您可以在将来将其用于其他容器。

简单而可靠的方法是进行卷映射,例如docker-compose yaml文件将有一个卷部分,如下所示:

….
volumes:
    - ./: /usr/src/app
    -  /usr/src/app/node_modules

对于 docker run 命令,请使用:

-v ./:/usr/src/app

在 Dockerfile 上,定义:

VOLUME /usr/src/app
VOLUME /usr/src/app/node_modules

但首先确认运行npm install确实在主机系统上创建了 node_modules 目录。

让我尝试解决您遇到的问题。

这是Dockerfile

# Use alpine for slimer image
FROM node:9-alpine

RUN mkdir /app
WORKDIR /app

COPY /dashboard-folder/package.json . 

RUN npm i --production

COPY node_modules ./root

假设您的项目结构如下所示:

|root
     |   Dockerfile
     |
     \---dashboard-folder
             package.json

其中 root 是您将接收node_modules工作目录

使用docker build . -t name构建镜像这个镜像docker build . -t name docker build . -t name然后像这样使用它:

docker run -it --rm ${PWD}:/app/root NAME mv node_modules ./root

应该做的伎俩。

您遇到问题的主要原因取决于主机上运行的操作系统。 如果您的主机运行 Linux,那么肯定没问题,但如果您的主机在 Mac 或 Windows 上,那么发生的情况是 docker 实际上运行在对您隐藏的 VM 上,因此您无法直接映射到主机的路径系统。 相反,您可以使用 Volume。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM