【问题标题】:Cannot install npm package in a mounted directory无法在挂载目录中安装 npm 包
【发布时间】:2018-02-07 13:52:39
【问题描述】:

我的想法是使用 docker 容器与应用程序分开构建 js 和 css 资产。我在主机上有代码,我正在尝试使用我的代码将目录作为卷挂载到 docker 容器。但是在 Dockerfile 中,当我执行 RUN npm install sematic-ui --save 时,它不会更改我尝试挂载的目录中的任何内容。

在构建过程中安装的卷是否可用,或者我应该仅在运行映像时安装 npm 包?

另外,我的最佳做法是什么?

编辑:

我简化了案例来展示一个例子。这是我的文件。

docker-compose.yml

version: '3'
services:
 web:
  build: .
  volumes:
    - ./vol:/root/test

Dockerfile

FROM debian:9
WORKDIR /root/test
RUN touch index.html
CMD /bin/sh

然后我做docker-compose build。 我希望在主机上的vol 目录中看到 index.html。为什么这不会发生?正如我注意到一些 docker 图像可能会在构建过程中更改主机的文件系统。但我做不到。

【问题讨论】:

  • 请发布您的整个 Dockerfile
  • @bluescores 查看我的编辑

标签: node.js docker npm semantic-ui docker-volume


【解决方案1】:

当你挂载一个卷时,它会替换你在容器中挂载它的目录中的所有内容。 /root/test 中的任何内容都将替换为您的主机 ./vol 目录。


我也不确定这是否会起作用,因为当这些行发生时:

WORKDIR /root/test
RUN touch index.html

/root/test 目录不存在。我不确定 Docker 将 index.html 放在哪里。通常我会RUN mkdir -p /root/test 以确保明确创建容器路径。

【讨论】:

  • 我把RUN mkdir -p /root/test放在WORKDIR /root/test之前。重建后什么也没发生(vol 仍然是空的)。顺便说一句,如果我做docker-compose up 然后docker-compose run web 和容器内,当我创建一个文件时,它会出现在vol 目录中。所以它只有在构建之后才能工作。
  • 查看我回答的第一部分。当您在 docker-compose 中安装卷时,您在功能上擦除了容器中 /root/test 中存在的所有内容。这将包括 index.html 文件。
  • 我认为你是对的。但是仍然不可能在构建阶段更改主机文件。我决定使用ENTRYPOINT 脚本来处理这个问题。这就是mysql:5.7 图像中的情况。
猜你喜欢
  • 2020-09-17
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 2018-02-28
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
相关资源
最近更新 更多