在没有容器服务 运行 的情况下同步 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 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,您应该将 command
更改为 node src/index.js
。然后你可以使用 docker-compose up
而不是整个 docker run ....
我创建了一个 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 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,您应该将 command
更改为 node src/index.js
。然后你可以使用 docker-compose up
而不是整个 docker run ....