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中有这条线真的没有好处。