在没有运行容器服务的情况下,在Docker容器中同步本地代码
我创build了一个具有可执行节点js应用程序的docker镜像。
我有多个独立于自己的模块。 这些模块使用npm link
命令作为npm link
内部的包创build,因此可以在我的节点js索引文件中使用。
目录结构是
|-node_modules |-src |-app |-index.js |-independent_modules |-some_independent_task |-some_other_independent_task
在构build映像时,我已经为根node_modules
中的每个独立模块创build了npm link
。 这将在每个独立的模块内创build一个node_modules
文件夹,而不存在于本地。 这只在容器内部创build。
我需要这些模块在src/app/index.js
并继续我的任务。
这个docker镜像不使用服务器来保持容器运行,因此容器在过程结束时停止。
我使用build立图像
docker build -t demoapp
要在开发环境中运行index.js,我需要将本地src目录挂载到docker src目录,以反映更改而不重build映像。
安装和运行我使用命令
docker run -v $(pwd)/src:/src demoapp node src/index.js
这里的问题是,在本地,没有安装依赖关系,即没有node_modules
文件夹存在。 因此,在将本地目录安装到docker中时,将其replace为空的,因此在node_modules
安装的依赖关系在node_modules
消失了。
我试图使用.dockerignore
不装载node_modules
文件夹,但它没有工作。 而且,在本地保留空的node_modules
也是行不通的。
我也尝试使用docker-compose来保持卷同步,并node_modules
隐藏了node_modules
,但是我认为这只在node_modules
与任何服务器运行时同步,即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
我在这里读到,使用它会跳过`node_modules同步。
但是这也不适合我。
我需要在一个已停止的docker容器中每次执行这个index.js,同时将本地代码同步到node_modules
workdir并跳过dependencies文件夹(即node_modules
。
还有一件事情,如果可能发生将有所帮助。 每次我做docker-compose up
或docker-compose run
它打印准备好了。 我可以拥有一些东西,我可以用CLI传递的命令覆盖docker-compose中的命令。
像docker-compose run | {some command}
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 ....