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

时间:2017-11-01 12:29:55

标签: node.js docker docker-compose node-modules docker-swarm

我创建了一个docker镜像,它有一个可执行节点js app。

我有多个独立于自己的模块。这些模块使用npm link命令在docker中创建为一个包,因此可以在我的节点js索引文件中使用。

目录结构为

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

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

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

此泊坞窗图像不使用服务器来保持容器运行,因此容器会在流程结束时停止。

我使用

构建图像
docker build -t demoapp

要在开发环境中运行index.js,我需要将本地src 目录挂载到 docker src 目录,以反映更改而不重建映像。

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

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容器一直在运行。

这是我用过的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 workdir并跳过依赖项文件夹,即node_modules

如果它可能发生,还有一件事会有所帮助。每次我docker-compose updocker-compose run时都会打印出来。我可以使用从CLI传递的命令覆盖docker-compose中的命令。

类似于docker-compose run | {some command}

1 个答案:

答案 0 :(得分:1)

您已定义了一个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 ....