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

使用docker-compose在dockerizednode.js应用中重新加载代码

如何解决《使用docker-compose在dockerizednode.js应用中重新加载代码》经验,为你挑选了1个好方法。

我有一个琐碎的node.js码头工人应用程序。

我能够成功运行它,但是尽管按照docker-compose docs中的说明安装了卷,但是在容器内部重新加载代码仍然无法正常工作。

目录布局:

my-test-app
| docker-compose.yml
| Dockerfile
| index.js
| package.json

Dockerfile:

FROM mhart/alpine-node:8
WORKDIR /app
COPY . .
EXPOSE 5000
CMD ["node", "index.js"]

docker-compose.yml:

version: '3'
services:
  node-app:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/app
  redis:
    image: "redis:alpine"

index.js:

const http = require('http');
const server = http.createServer((req, res) => {
  res.end("hello world");
});
server.listen(5000);

package.json:

{
  "name": "my-test-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
  },
  "author": "",
  "license": "MIT"
}

我也尝试了以下相同的结果(应用运行,无法实时重新加载代码)

使用官方节点图片,而不是alpine-node

将应用程序代码放在./app内部的文件夹下,my-test-app并相应地更新COPY内部Dockerfilevolumes内部docker-compose.yml

Kryten.. 6

我看到过短语“实时重载”用于两种不同类型的重载:

    代码更改时终止并重新启动应用程序,以及

    代码更改后,会自动在客户端浏览器上重新加载HTML和资产。

根据您的问题,我认为您指的是第一种类型,因此下面的答案可以解决该问题。


这里的问题是上下文之一

请记住,docker容器与您的主机是隔离的-特别是,容器中运行的进程与主机上运行的进程是不同的(通常不能与之交互)。在您的情况下,您已选择在容器中装载主机目录,但这只是文件系统,而不是进程。

考虑一下实例化新容器时Docker映像的作用:它在node index.js中运行WORKDIR。代码在哪里停止并在代码更改时重新启动?大概它正在主机上的一个进程中运行。这意味着它无法接触容器中运行的节点进程(因为它是隔离的)。

现在,您还没有提到要使用哪种方法来处理实时重新加载,但这并没有太大的区别。它们基本上都以相同的方式工作:更改应用程序代码后,终止现有进程并开始一个新进程。

要解决此问题,您有两种选择:

    在容器中运行“实时重新加载”代码,或者

    在容器外运行开发代码

首先,您可以遵循@MarkS的建议并使用nodemon。这应该像更换一样简单

CMD ["node", "index.js"]

在你的Dockerfile中

CMD ["nodemon", "index.js"]

当然,前提是您已经nodemon正确安装了映像。

替代方法(这就是我的工作)是在开发过程中在Docker环境外部的主机上运行代码,然后在部署时将其打包为映像。这解决了两个问题:

    您在隔离节点进程中遇到的问题,以及

    权限问题。

请记住,在Docker中运行的应用程序以方式运行root。这意味着,如果您的应用创建文件,它们将归拥有root。我曾尝试在Docker环境中进行开发,但对一些问题感到沮丧,例如,我想删除该应用程序创建的文件,而不得不sudo(以身份登录root)只是为了清理东西。



1> Kryten..:

我看到过短语“实时重载”用于两种不同类型的重载:

    代码更改时终止并重新启动应用程序,以及

    代码更改后,会自动在客户端浏览器上重新加载HTML和资产。

根据您的问题,我认为您指的是第一种类型,因此下面的答案可以解决该问题。


这里的问题是上下文之一

请记住,docker容器与您的主机是隔离的-特别是,容器中运行的进程与主机上运行的进程是不同的(通常不能与之交互)。在您的情况下,您已选择在容器中装载主机目录,但这只是文件系统,而不是进程。

考虑一下实例化新容器时Docker映像的作用:它在node index.js中运行WORKDIR。代码在哪里停止并在代码更改时重新启动?大概它正在主机上的一个进程中运行。这意味着它无法接触容器中运行的节点进程(因为它是隔离的)。

现在,您还没有提到要使用哪种方法来处理实时重新加载,但这并没有太大的区别。它们基本上都以相同的方式工作:更改应用程序代码后,终止现有进程并开始一个新进程。

要解决此问题,您有两种选择:

    在容器中运行“实时重新加载”代码,或者

    在容器外运行开发代码

首先,您可以遵循@MarkS的建议并使用nodemon。这应该像更换一样简单

CMD ["node", "index.js"]

在你的Dockerfile中

CMD ["nodemon", "index.js"]

当然,前提是您已经nodemon正确安装了映像。

替代方法(这就是我的工作)是在开发过程中在Docker环境外部的主机上运行代码,然后在部署时将其打包为映像。这解决了两个问题:

    您在隔离节点进程中遇到的问题,以及

    权限问题。

请记住,在Docker中运行的应用程序以方式运行root。这意味着,如果您的应用创建文件,它们将归拥有root。我曾尝试在Docker环境中进行开发,但对一些问题感到沮丧,例如,我想删除该应用程序创建的文件,而不得不sudo(以身份登录root)只是为了清理东西。


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • yum安装_Redis —yum安装全过程
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Redis—yum安装全过程相关的知识,希望对你有一定的参考价值。访问https://redi ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
kafei
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有