当前位置: 首页 > 面试题库 >

在Docker容器中安装node_modules并将其与主机同步

华宪
2023-03-14
问题内容

node_modules在Docker容器中安装并将其与主机同步时遇到问题。我的Docker版本是,18.03.1-ce, build 9ee9f40而Docker Compose版本是1.21.2, build a133471

我的docker-compose.yml样子是:

# Frontend Container.
frontend:
  build: ./app/frontend
  volumes:
    - ./app/frontend:/usr/src/app
    - frontend-node-modules:/usr/src/app/node_modules
  ports:
    - 3000:3000
  environment:
    NODE_ENV: ${ENV}
  command: npm start

# Define all the external volumes.
volumes:
  frontend-node-modules: ~

我的Dockerfile

# Set the base image.
FROM node:10

# Create and define the working directory.
RUN mkdir /usr/src/app
WORKDIR /usr/src/app

# Install the application's dependencies.
COPY package.json ./
COPY package-lock.json ./
RUN npm install

该应用程序运行良好。源代码已同步。热装也很棒。

我唯一的问题node_modules是主机上的文件夹为空。是否可以将node_modulesDocker容器中的文件夹与主机同步?

另外,我已经找到了此博客文章。作者试图解决我面临的同样问题。问题是,node_modules由于我们只是将它们从Docker容器复制到主机,因此不会同步。

我希望我node_modules的Docker容器内部与主机同步。请考虑到我想要的:

  • node_modules自动安装而不是手动安装
  • 安装node_modules在Docker容器而不是主机中
  • 已经node_modules与主机同步(如果我安装多克尔容器内的一些新的包装,应自动与主机,而无需任何手动操作同步)

我需要node_modules主持人,因为:

  • 在需要时可以阅读源代码
  • IDE需要node_modules本地安装,以便可以访问devDependencies诸如eslintprettier。我不想devDependencies全局安装这些。

提前致谢。


问题答案:

首先,我要感谢David Maze和trust512发布他们的答案。不幸的是,他们没有帮助我解决我的问题。

我想发表我对这个问题的答案。

我的docker-compose.yml

---
# Define Docker Compose version.
version: "3"

# Define all the containers.
services:
  # Frontend Container.
  frontend:
    build: ./app/frontend
    volumes:
      - ./app/frontend:/usr/src/app
    ports:
     - 3000:3000
    environment:
      NODE_ENV: development
    command: /usr/src/app/entrypoint.sh

我的Dockerfile

# Set the base image.
FROM node:10

# Create and define the node_modules's cache directory.
RUN mkdir /usr/src/cache
WORKDIR /usr/src/cache

# Install the application's dependencies into the node_modules's cache directory.
COPY package.json ./
COPY package-lock.json ./
RUN npm install

# Create and define the application's working directory.
RUN mkdir /usr/src/app
WORKDIR /usr/src/app

最后但并非最不重要的entrypoint.sh

#!/bin/bash

cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/
exec npm start

这里最棘手的部分是将安装程序安装node_modules到我们的中定义node_module的缓存目录(/usr/src/cache)中Dockerfile。之后,entrypoint.sh将将其node_modules从缓存目录(/usr/src/cache)移至我们的应用程序目录(/usr/src/app)。由于这个原因,整个node_modules目录将出现在我们的主机上。

看着上面的问题,我想要:

  • node_modules自动安装而不是手动安装
  • 安装node_modules在Docker容器而不是主机中
  • 已经node_modules与主机(同步,如果我安装多克尔容器内的一些新的包装,应自动与主机无需任何手动操作同步

第一件事完成了:node_modules自动安装。第二件事也完成了:node_modules安装在Docker容器中(因此,不会出现跨平台问题)。第三件事也完成了:node_modules安装在Docker容器中的主机将在我们的主机上
可见 并且将被 同步 !如果我们在Docker容器中安装了一些新软件包,它将立即与我们的主机同步。

需要注意的重要一点:确实,安装在Docker容器中的新软件包将出现在中/usr/src/app/node_modules。由于此目录与我们的主机同步,因此这个新软件包也将出现在我们主机的node_modules目录中。但是,此时/usr/src/cache/node_modules将具有旧版本(没有此新软件包)。无论如何,这对我们来说不是问题。在下一个docker- compose up --build--build必需)期间,Docker将重新安装node_modules(因为package.json已更改),并且entrypoint.sh文件会将它们移至我们的/usr/src/app/node_modules

您应该考虑另一件事。如果您git pull远程存储库中获取代码,或者git checkout your-teammate- branch在运行Docker时,可能会将一些新软件包添加package.json文件中。在这种情况下,您应该使用停止Docker,CTRL + C然后使用docker-compose up --build--build必需)再次将其重新启动。如果您的容器作为守护程序运行,则应执行docker-compose stop以停止容器并使用docker-compose up --build--build必需)再次将其重新启动。

如有任何疑问,请在评论中让我知道。

希望这可以帮助。



 类似资料:
  • 问题内容: 我正在尝试通过我的应用进行连接。如果我通过或通过运行应用程序,则所有这些工作都可以进行。但是,当我在其中运行应用程序时,出现以下错误消息: 请注意,在以上错误消息中正确,但其他时间晚了5天。 我发现有趣的是,我只在docker容器中收到过此消息。 需要注意的一件事是,但是删除它根本没有帮助我 我基本上从IntelliJ运行相同的步骤,但没有问题,但是在docker中,到期日期似乎要晚5

  • 问题内容: 我找不到这个问题的直接答案,但是这里是: 假设我有一台主机,最多可打开1024个文件: 和在该主机中运行的docker容器,其中包含: 如果我尝试打开1024个以上的文件,那么容器中会有问题吗?我认为在这种情况下,容器的实际限制将是1024个文件。你怎么看? 问题答案: 虽然有点晚,但我只想清除对ulimit差异的怀疑。 如果在运行容器时确实设置了该值,则容器内显示的ulimit值来自

  • 我现在很困惑。我尝试了很多我可以在网上找到的东西,但是,没有一个解决它。我使用WSL2安装了Win10和Docker desktop来托管Linux容器。我使用以下命令启动詹金斯网站。 这个很管用。我可以使用访问网站 谢谢你 编辑:只是想解释一下我做了什么来解决我的问题。创建network是我最初所做的,但由于我卷曲网页的方式错误,所以失败了。我做只是为了便于在上定位我的容器。但是,正如我的问题中

  • 问题内容: 我一直在关注几种不同的教程以及官方教程,但是每当我尝试在容器中安装PostgreSQL时,我都会收到以下消息 我在SO和整个互联网上浏览了几个问题,但是没有运气。 问题答案: 问题是您的应用程序/项目正在尝试访问HOST机器(不是docker容器)中的postgres套接字文件。 要解决这个问题,要么必须在使用该标志为postgres容器设置端口时明确要求进行tcp / ip连接,要么

  • 我一直在关注几个不同的教程以及官方教程,但是每当我试图在容器中安装PostgreSQL时,我都会收到以下消息 我在SO和整个互联网上看了几个问题,但没有运气。