我正在将应用程序移动到新的构建管道。在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目录。
答案 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。