热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

构建Dockerfile-在中间容器之间保留文件

如何解决《构建Dockerfile-在中间容器之间保留文件》经验,为你挑选了1个好方法。

我正在使用keymetrics官方图像docker hub链接构建一个非常基本的容器

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

Dockerfile(npm install)中的步骤将节点程序包下拉到node_modules文件夹中-IT WORKS。创建文件夹并下载文件,并在生成输出中显示(如下)。

问题在于,该RUN命令完成后,中间容器将被删除,而我丢失了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" ]

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

建立输出

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
...  ...

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步之后是否可以执行该操作?

从构建输出中可以证明已npm install运行并将软件包拉到相应的目录...。

但是在步骤7中,它消失了吗?此外,在最终图像上,该图像已消失。应用程序无法正常运行,因为node_modules最终映像中的依赖项已被破坏。

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

我可以执行此工作的唯一方法是npm_install在构建外部运行,然后使用来复制文件夹,COPY这绝对不是有效的解决方案...但这是一种行之有效的解决方法。

我知道它使用了有意义的中间容器,但是如何使在RUN命令中创建的文件保留到最后呢?

编辑:进一步的调查显示,在此处找到的源映像dockerfile VOLUME在其dockerfile中声明了一个-这是我的问题所在吗?他们的示例表明,npm install开箱即用即可完成工作,但并不能消除,因为它会清除安装下载的文件。



1> BMitch..:

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

VOLUME ["/app"]

这破坏了以后的步骤和修改/app目录的子映像。从码头工人的文档:

从Dockerfile中更改卷:如果在声明了卷后有任何构建步骤更改了卷中的数据,则这些更改将被丢弃。

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

我以前已经在博客上介绍了Dockerfiles中定义的卷的问题,这是其中的问题之一。在他们的Dockerfile中确实没有任何上行空间。


推荐阅读
  • 【前端工具】nodejs+npm+vue 安装(windows)
    预备先看看这几个是干嘛的,相互的关系是啥。nodejs是语言,类比到php。npm是个包管理,类比到composer。vue是个框架&# ... [详细]
  • 本文详细介绍了如何创建和使用VUE uni-app开发环境,包括通过HBuilderX可视化界面和通过vue-cli命令执行的方法。文章内容简单清晰,易于学习与理解。通过学习本文,读者可以深入了解VUE uni-app开发环境,并通过实践验证掌握具体的使用情况。编程笔记将为读者推送更多相关知识点的文章,欢迎关注! ... [详细]
  • Node.js详细安装及环境配置
    1、下载安装根据自己电脑系统及位数选择,我这里选择windows64位.msi格式安装包(官网:https:odejs.orgzh-cndownload).msi和.zip格式区别 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • RN即ReactNative基于React框架针对移动端的跨平台框架,在学习RN前建议最好熟悉下html,css,js,当然如果比较急,那就直接上手吧,毕竟用学习前面基础的时间,R ... [详细]
  • css div中文字位置_超赞的 CSS 阴影技巧与细节
    本文的题目是CSS阴影技巧与细节。CSS阴影,却不一定是box-shadow与filter:drop-shadow,为啥?因为使用其他属性 ... [详细]
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
  • 前言:原本纠结于Web 模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中eval函数。虽然eval函 ... [详细]
  • Vue cli2.0 项目中使用Monaco Editor编辑器
    monaco-editor是微软出的一条开源web在线编辑器支持多种语言,代码高亮,代码提示等功能,与VisualStudioCode功能几乎相同。在项目中可能会用带代码编 ... [详细]
author-avatar
mobiledu2502882465
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有