在没有容器服务 运行 的情况下同步 docker 容器内的本地代码

Syncing local code inside docker container without having container service running

我创建了一个 docker 图像,其中有一个可执行节点 js 应用程序。

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

目录结构如

|-node_modules
|-src
  |-app
    |-index.js
  |-independent_modules
    |-some_independent_task
    |-some_other_independent_task

在构建图像时,我为根 node_modules 中的每个独立模块创建了 npm link。这会在每个独立模块中创建一个 node_modules 文件夹,该文件夹在本地不存在。这仅在容器内创建。

我在 src/app/index.js 中需要这些模块并继续我的任务。

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

我使用

构建图像
docker build -t demoapp

为了运行开发环境中的index.js我需要将local src目录挂载到docker src 目录以反映更改而不重建图像。

对于安装和 运行ning 我使用命令

docker run -v $(pwd)/src:/src demoapp node src/index.js

这里的问题是,在本地,没有安装依赖项,即不存在 node_modules 文件夹。因此,当将本地目录挂载到 docker 时,它会将其替换为一个空目录,因此 node_modules 中 docker 中安装的依赖项会消失。

我尝试使用 .dockerignore 来不挂载 node_modules 文件夹,但没有成功。此外,在本地保留空 node_modules 也不起作用。

我还尝试使用 docker-compose 来保持卷同步并从中隐藏 node_modules,但我认为这仅在 docker 为 运行 时同步任何服务器,即 docker 容器保持 运行ning.

这是我用的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

我读到这个 ​​here 使用它会跳过 `node_modules 同步。

但这也不适合我。

我需要每次在停止的 docker 容器中执行此 index.js,本地代码同步到 docker 工作目录并跳过依赖项文件夹,即 node_modules .

如果可能的话,再做一件事会有所帮助。每次我做 docker-compose updocker-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,您应该将 command 更改为 node src/index.js。然后你可以使用 docker-compose up 而不是整个 docker run ....