构建我的Docker容器时,出现了GraphQL ERESOLVE无法解析依赖树的问题。

14
这是我的文件。
我认为这是问题的核心。
Could not resolve dependency:
npm ERR! peer graphql@"^0.12.0 || ^0.13.0 || ^14.0.0" from graphql-middleware@4.0.2

docker-compose.yml

version: '3.7'

services:
  apollo:
    container_name: apollo
    build:
      context: .
      dockerfile: Dockerfile
    environment:
        -  NODE_ENV=development
    volumes:
      - '.:/app'
      - '/app/node_modules'

    ports:
      - 4000:4000

    restart: always

Dockerfile

# Use the official image as a parent image.
FROM node:current-slim

# Set the working directory.
WORKDIR /app

# Setting environment path.
ENV PATH=/app/node_modules/.bin:$PATH

# Copy the file from your host to your current location.
COPY package.json .

# Run the command inside your image filesystem.
RUN npm init --yes
RUN npm install --save cors apollo-server-express express graphql reflect-metadata type-graphql apollo-datasource-rest soap jsonwebtoken --yes
RUN npm install nodemon -g --yes

# Add metadata to the image to describe which port the container is listening on at runtime.
EXPOSE 4000

# Copy the rest of your app's source code from your host to your image filesystem.
COPY . .
CMD [ "nodemon", "index.js" ]

依赖错误
$ docker-compose up --build
Building apollo
Step 1/10 : FROM node:current-slim
 ---> f3f62dfcc735
Step 2/10 : WORKDIR /app
 ---> Using cache
 ---> 33088e65c748
Step 3/10 : ENV PATH=/app/node_modules/.bin:$PATH
 ---> Using cache
 ---> c7f742267b26
Step 4/10 : COPY package.json .
 ---> Using cache
 ---> 76285ea4a8ca
Step 5/10 : RUN npm init --yes
 ---> Using cache
 ---> 29a3d715136b
Step 6/10 : RUN npm install --save cors apollo-server-express express graphql reflect-metadata type-graphql apollo-datasource-rest soap jsonwebtoken --yes
 ---> Running in 1e4472bcd901
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: apollo-express-server@1.0.0
npm ERR! Found: graphql@15.4.0
npm ERR! node_modules/graphql
npm ERR!   graphql@"^15.3.0" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer graphql@"^0.12.0 || ^0.13.0 || ^14.0.0" from graphql-middleware@4.0.2
npm ERR! node_modules/graphql-middleware
npm ERR!   graphql-middleware@"^4.0.2" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR! 
npm ERR! See /root/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-11-05T16_19_42_605Z-debug.log
ERROR: Service 'apollo' failed to build : The command '/bin/sh -c npm install --save cors apollo-server-express express graphql reflect-metadata type-graphql apollo-datasource-rest soap jsonwebtoken --yes' returned a non-zero code: 1
5个回答

19

没有必要降级到npm 6。 实际上,npm 7仍然可以使用选项--legacy-peer-deps。

npm install --legacy-peer-deps

这个解决方案仍然适用于npm 8。 - Stephane Duteriez

19

问题显然出在NPM和您尝试安装的软件包上,而不是与Docker有关。

不幸的是,我无法重现您面临的确切错误。这可能是因为:

  • 现在和出现问题之间的时间发生了改变;
  • 有一些您没有向我们展示的重要细节。

无论哪种情况,都有一种通用的解决此类问题的方法,应该会有所帮助。但首先要进行解释。

依赖项、对等依赖项和冲突

NPM的软件包(依赖项)管理机制允许软件包(依赖项)具有:

  • (直接)依赖项 - 与软件包自动安装;
  • 对等依赖项 - 必须由软件包的使用者手动安装。

但是,NPM不允许同一软件包的多个版本共存。

此外,如您可能所知,软件包使用标准语义版本控制,这意味着主要版本更改表示破坏性更改。

由于这两个原因,如果一个软件包要求依赖项A为v1,而另一个软件包希望相同的依赖项A为v2,则会发生冲突。

NPM v7

NPM v7最近发布,这是当前(截至2020年11月)node:current映像使用的版本。

NPM7带来的最大变化可能与对等依赖项有关 - 如果可能的话,NPM现在应该能够自动安装它们。 在此处阅读更多信息

如文档所述,在无法解决冲突的情况下,NPM现在应该抛出错误而不是警告,这就是您所看到的内容。

然而,我却只用您的设置和NPM v7.0.8获得了警告而没有错误,我不知道原因。然而,报告的问题本质上是相同的,因此解决方案应该非常相似。

如何解决冲突

我所知道的唯一解决方案是手动解决冲突 - 开发人员需要调整其依赖关系以使其兼容。

在您的特定情况下,问题似乎出在graphql软件包上。最新的graphql软件包是v15,也是最新的type-graphql软件包(v1)的对等依赖项。

然而,apollo-server-express有一些依赖关系,显然只支持graphql到v14为止。

在等待apollo-server-express完全支持v15之前,您可以通过降级唯一需要v15的软件包来选择使用完全的graphql v14。因此,如果您将npm install更改为以下内容:

npm install --save cors apollo-server-express express graphql@14 reflect-metadata type-graphql@0 apollo-datasource-rest soap jsonwebtoken

它应该能够工作...请注意,我们明确安装了graphql@14type-graphql@0(是的,版本为零)。

备选方案

我会给你一些不好的建议。在某些情况下,缺少对等依赖项可能并不是一个问题,尤其是如果您从未使用相关功能。在您的情况下,可能更少成为问题,因为您已经具有依赖性,只是没有所需版本。完全有可能错误的版本也能正常运行。 如果您感到幸运(或者您确定自己在做什么),并且您真的希望继续使用graphql v15,则可以选择:

  • 抑制任何NPM输出以消除错误提示;
  • 降级到工作方式完全不同的NPM v6(尽管它仍会警告您存在对等依赖项问题)。

谨慎进行


2
npm install package_name --legacy-peer-deps

或者

npm install package_name --force

将解决此问题。


2

我有一个类似的错误,在我的情况下只需要手动安装所有依赖项即可。

npm install --save express
npm install --save express-graphql
npm install --save graphql
npm install --save mongoose

谢谢。我在从Gatsby 2.x升级到3.3.1后也遇到了类似的express-graphql问题。express-graphql没有出现在主要的package.json中,所以安装它会将其添加到package.json并解决警告。对于类似的警告,我猜查找package.json中是否存在该包并未发现它是首先要解决的事情。 - sdexp

0

我在构建一个使用CoreUI和其他JS库的ReactJS应用程序时遇到了同样的问题。我注意到其中一些依赖项使用了旧版本的依赖项,并且在它们的package.json文件中明确指定了要使用的版本。尝试了上述所有解决方案后,docker(docker build .)仍无法构建我的镜像。

我将基础镜像从node:16-alpine3.11更改为node:12-alpine3.11,一切都完美地运行了。 使用这个基础镜像,我能够避免使用

npm install --save --legacy-peer-deps,这在我的情况下无法正常工作

我的建议是,如果有人遇到这些问题,只需尝试不同的node docker镜像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接