build设Dockerfile – 保留中间容器之间的文件

我在这里build立一个使用keymetrics官方图像docker中心链接的非常基本的容器

然而,这不是一个node.js或pm2的问题,这是一个Docker问题,尤其是Docker docker build

Dockerfile( npm install )中的一个步骤将节点包下拉到node_modules文件夹中 – IT WORKS。 文件夹被创build并且文件下载并且被显示在构build输出(下面)中。

问题是,在运行命令完成后,中间容器被删除,我失去了node_modules文件夹。

我的dockerfile有几个ls -l命令来澄清这些文件是怎么回事。

保留在工作目录( /app )中的唯一文件是使用COPY命令从主机复制的文件

这是我的Dockerfile:

 FROM keymetrics/pm2:latest # Bundle APP files COPY src src/ COPY package.json . COPY pm2.json . # Install app dependencies ENV NPM_CONFIG_LOGLEVEL info RUN pwd && ls -l /app && npm install && ls -l # Show current folder structure in logs RUN ls -l CMD [ "pm2-docker", "start", "pm2.json" ] 

构build命令: docker build -t localapps/pm2_test_app:0.0.4 .

build立输出

 Sending build context to Docker daemon 13.31kB Step 1/8 : FROM keymetrics/pm2:latest ---> 6aa333f957ec Step 2/8 : COPY src src/ ---> Using cache ---> 6b73b4463af5 Step 3/8 : COPY package.json . ---> Using cache ---> d27a2e75fdde Step 4/8 : COPY pm2.json . ---> Using cache ---> 9864d9dd73a9 Step 5/8 : ENV NPM_CONFIG_LOGLEVEL info ---> Using cache ---> 9f711fe6bada Step 6/8 : RUN pwd && ls -l /app && npm install && ls -l ---> Running in 668eb2e2c1e8 /app total 12 -rw-r--r-- 1 root root 323 Nov 8 17:33 package.json -rw-r--r-- 1 root root 123 Nov 8 16:59 pm2.json drwxr-xr-x 2 root root 4096 Nov 8 18:10 src npm info it worked if it ends with ok npm info using npm@5.5.1 npm info using node@v9.0.0 ... <omitting useless npm logs> ... added 8 packages in 2.001s npm info ok total 20 drwxr-xr-x 10 root root 4096 Nov 8 19:49 node_modules -rw-r--r-- 1 root root 1833 Nov 8 19:49 package-lock.json -rw-r--r-- 1 root root 323 Nov 8 17:33 package.json -rw-r--r-- 1 root root 123 Nov 8 16:59 pm2.json drwxr-xr-x 2 root root 4096 Nov 8 18:10 src ---> 0d749171a431 Removing intermediate container 668eb2e2c1e8 Step 7/8 : RUN ls -l ---> Running in fc2132121c96 total 12 -rw-r--r-- 1 root root 323 Nov 8 17:33 package.json -rw-r--r-- 1 root root 123 Nov 8 16:59 pm2.json drwxr-xr-x 2 root root 4096 Nov 8 18:10 src ---> c689180648c9 Removing intermediate container fc2132121c96 Step 8/8 : CMD pm2-docker start pm2.json ---> Running in e70b2b89b3c8 ---> 299c26f883e8 Removing intermediate container e70b2b89b3c8 Successfully built 299c26f883e8 Successfully tagged localapps/pm2_test_app:0.0.4 

^^注意node_modules目录是否存在,并且在步骤6完成之后很好?

从构build输出,它certificate了npm install运行,并拉下包到适当的目录….

但是在第7步,它已经不存在了! 而且在最后的形象上,它已经消失了。 应用程序不起作用,因为node_modules的依赖关系在最终图像中被破坏。

为什么? 没有node_modules目录,应用程序将无法运行,它们是依赖关系。

唯一的办法,我可以得到这个工作是在构build之外运行npm_install ,然后复制该文件夹中使用COPY这绝对不是一个有效的解决scheme…但它是一个成熟的解决方法。

我知道它使用的中间容器是有道理的,但是如何使RUN命令中创build的文件保留到最后?

编辑:进一步的调查显示,在这里find的源图像dockerfile在其dockerfile中声明VOLUME – 这是我的问题来自哪里? 他们的例子表明,只是做一个npm install ,但它没有,因为它消除了安装下载的文件。

keymetrics / pm2映像在其Dockerfile中包含以下行:

 VOLUME ["/app"] 

这打破了以后的步骤和子图像修改/app目录。 从docker的文档 :

更改Dockerfile中的音量:如果任何构build步骤在声明后更改了音量内的数据,则这些更改将被丢弃。

您将需要在不同的目录中运行您的构build,创build不包含该行的不同基础映像,或者说服上游作者删除该行。

我已经在Dockerfiles中定义了有关卷的问题 ,而这是其中一个问题。 在Dockerfile中有这条线真的没有好处。

Interesting Posts