Node.js 在docker容器内同步本地代码而不运行容器服务

Node.js 在docker容器内同步本地代码而不运行容器服务,node.js,docker,docker-compose,node-modules,docker-swarm,Node.js,Docker,Docker Compose,Node Modules,Docker Swarm,我已经创建了一个docker映像,它有一个可执行的节点js应用程序 我有多个独立的模块。这些模块是使用npm link命令在docker内部创建为包的,因此在我的节点js索引文件中可能需要这些模块 目录结构如下所示 |-node_modules |-src |-app |-index.js |-independent_modules |-some_independent_task |-some_other_independent_task 在构建映像时,我为根节

我已经创建了一个docker映像,它有一个可执行的节点js应用程序

我有多个独立的模块。这些模块是使用npm link命令在docker内部创建为包的,因此在我的节点js索引文件中可能需要这些模块

目录结构如下所示

|-node_modules
|-src
  |-app
    |-index.js
  |-independent_modules
    |-some_independent_task
    |-some_other_independent_task
在构建映像时,我为根节点中的每个独立模块创建了npm链接。这将在每个独立的模块内创建一个node_modules文件夹,该文件夹在本地文件中不存在。这仅在容器内部创建

我需要src/app/index.js中的这些模块,然后继续我的任务

此docker映像不使用服务器来保持容器运行,因此当进程结束时容器停止

我使用

docker build -t demoapp
要在dev环境中运行index.js,我需要将本地src目录装载到docker src目录,以反映更改,而无需重建映像

对于装载和运行,我使用命令

docker run -v $(pwd)/src:/src demoapp node src/index.js
这里的问题是,在本地,没有安装依赖项,即不存在node_modules文件夹。因此,在将本地目录装入docker时,它会将其替换为一个空目录,因此安装在docker中的node_模块中的依赖项将消失

我尝试使用.dockrignore不装载node_modules文件夹,但没有成功。此外,将空节点_模块保留在本地也不起作用

我还尝试使用docker compose保持卷同步,并隐藏节点_模块,但我认为这仅在docker与任何服务器(即docker容器)一起运行时同步

这是我用的docker-compose.yml

# docker-compose.yml

version: "2"

services:

  demoapp_container:
    build: .
    image: demoapp
    volumes:
      - "./src:/src"
      - "/src/independent_modules/some_independent_task/node_modules"
      - "/src/independent_modules/some_other_independent_task/node_modules"
    container_name: demoapp_container
    command: echo 'ready'
    environment:
    - NODE_ENV=development
我读到这篇文章,使用它将跳过“节点”模块的同步

但这对我也不管用

我需要每次在停止的docker容器中执行index.js,本地代码与docker workdir同步,并跳过dependencies文件夹,即node_模块

如果可能的话,还有一件事会有所帮助。每次我做docker compose up或docker compose run时,它都会打印就绪。我可以用从CLI传递的命令覆盖docker compose中的命令吗


类似docker compose run |{some command}。

您已经定义了docker compose文件,但实际上并没有使用它。 由于您使用docker run,因此应尝试以下命令:

docker run \
    -v $(pwd)/src:/src \
    -v "/src/independent_modules/some_independent_task/node_modules" 
    -v "/src/independent_modules/some_other_independent_task/node_modules"
    demoapp \
    node src/index.js

如果要使用docker compose,应该将命令更改为node src/index.js。然后您可以使用docker compose up而不是整个docker运行…

BTW,您正在开发的应用程序是什么?它是如何工作的?如果你使用Doker-Run-V$PDW/SRC:/SRC DeMOApp节点SRC/DIXX.JS来运行应用程序,也许你应该考虑使用NoDimon来拥有应用程序和应用程序,在更新代码时重新启动。这就像我在DOCKER中开发了一些lambda函数代码。正如lambda从头到尾执行一个文件一样,我只需要开发大约50个lambda,这些lambda将在docker内部开发和运行。好吧,忘了我之前写的关于nodemon的内容。当您运行服务时,这会很有帮助。我的印象是,您正在开发一个主要执行“作业”的容器。是的,我也在docker中开发它们。当部署到生产环境中时,将设置和部署单个应用程序。谢谢,但我觉得您可能对npm链接感到困惑,您理解的链接是以相反的形式创建的,即src/node_模块包含指向实际/src/independent_modules/some_independent_task/node_modules文件夹的符号链接。docker run-它在容器运行时执行demoapp/bin/sh。对于已停止的容器,它不授予对其bash的访问权限。无论如何,该文件夹是空的,因为您没有取消映射它,并且它的内容在生成过程中被填充。您将docker运行与docker exec命令混淆。docker运行将创建一个新容器,它将一直运行,直到您注销。如果您想在现有容器docker exec上执行命令-it$containerName/bin/shYa抱歉,我在这里弄错了,docker run将创建一个新容器并运行命令,但在装载时使用-v with docker run会失败并同步node_modules文件夹。对于docker exec-it$containerName/bin/sh,容器需要运行。我的容器已停止,即在执行单个进程时停止。如果使用docker run运行docker compose,为什么要使用docker compose?我需要本地代码和容器代码之间的代码同步。我在docker run中使用了挂载,但它在容器中挂载了本地节点\u模块的空文件夹。因此,我使用docker compose来同步卷和跳过node_modules文件夹,但这也不起作用,因为每次运行后容器都会停止。