Docker 中的 Typescript:Visual Studio 代码主机 Typescript 编译器中“找不到模块”

And*_*Ray 6 typescript docker visual-studio-code

项目设置

我有一个在本地 Docker 容器中运行的 Typescript 项目。我有以下两卷(在docker-compose.yml):

volumes:
  - .:/node/app
Run Code Online (Sandbox Code Playgroud)

第一个卷是绑定安装,用于将我的应用程序的源代码复制到容器中。

  - /node/app/node_modules/
Run Code Online (Sandbox Code Playgroud)

第二卷位于绑定安装座内。这意味着当npm install在容器内运行时,在项目的/node/app工作目录中,依赖项将仅安装到容器中的node_modules文件夹中。

我的理解是,这是允许主机和容器独立的常见做法node_modules。我进行此设置的目的是仅在主机中安装和运行一些工具,例如prettier,这样我就可以npm install --only=development在主机中安装 prettier ,因为它被指定为 devDependency ,现在我的编辑器可以使用 prettier 。

问题

在我的编辑器中,当打字稿编译器运行时,它显示“找不到模块”错误:

在 Visual Studio 代码中找不到模块错误

我的理解是发生这种情况是因为这些模块不在磁盘上。这是因为我上面的设置。我已经将node_modules包含非开发依赖项(如 React)的内容仅在容器内可用。

我的问题

我是 Docker 新手,我的理解是在容器内做事情通常很好,包括开发。我试图避免npm install在主机中,因为我并不真正想要或需要主机中的所有依赖项。在添加新的依赖项时,我也不想必须执行npm install两次,一次在主机上,一次在容器中。

如果导入的node_modules不存在,有没有办法阻止Typescript出错(比如只加载它们的类型定义,也许?),或者有没有办法以某种方式将Visual Studio Code中的Typescript编译器指向容器,这样它就可以无需在主机上安装它们即可看到它们,同时仍然允许我在主机上安装其他依赖项,例如更漂亮?

npm install或者是主机上的唯一方法?

Rob*_*Rob 0

node_modules如果您想在 docker 内部和外部安装模块,则安装单独的卷是很常见的。例如,如果您想在 docker 容器之外运行项目,并且能够在 docker 容器中运行它。

您所建议的,将一些模块放在容器内,将其他模块放在容器外,我不确定是否有必要这样做。prettier也许更好的解决方案是在 docker 容器内运行......

services:
    prettier:
        image: node:latest
        volumes:
            - .:/node/app
        working_dir: /node/app
        entrypoint: npx prettier
Run Code Online (Sandbox Code Playgroud)

然后你就可以运行

docker-compose run --rm prettier <options>
Run Code Online (Sandbox Code Playgroud)