Docker安装节点模块并复制回主机

时间:2018-01-14 14:03:11

标签: node.js docker npm

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

我的想法是将npm安装步骤移动到使用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目录。

4 个答案:

答案 0 :(得分:1)

让我试着解决你遇到的问题。

以下是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 run -it --rm ${PWD}:/app/root NAME mv node_modules ./root

应该做的伎俩。

答案 1 :(得分:0)

根据documentation of the COPY instruction,COPY指令将文件从主机复制到容器。

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

答案 2 :(得分:0)

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

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

对于泊坞窗运行命令,请使用:

-v ./:/usr/src/app

并在Dockerfile上定义:

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

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

答案 3 :(得分:0)

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