我创建了一个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 up
或docker-compose run
时都会打印出来。我可以使用从CLI传递的命令覆盖docker-compose中的命令。
类似于docker-compose run | {some command}
。
答案 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 ....