首页 > 解决方案 > 使用 docker 时,npm 库不工作

问题描述

我尝试 Dockerize 一个使用 webpack 的 React 应用程序。当我在本地(在 MacOS 上)运行我的应用程序时,一切正常。

但是当我使用 docker 时,出现以下错误:

ERROR in ./src/containers/fenetre_log.jsx
Module not found: Error: Can't resolve 'ROSLIB' in '/usr/src/app/src/containers'

奇怪的是,roslib 在我的 package.json 中被很好地声明为依赖项......

这是我的 package.json:

{
  "license": "UNLICENSED",
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-eslint": "^8.0.0",
    "babel-loader": "^7.1.2",
    "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "css-loader": "^0.28.7",
    "eslint": "^4.6.1",
    "eslint-config-airbnb": "^15.1.0",
    "eslint-plugin-import": "^2.7.0",
    "eslint-plugin-jsx-a11y": "^5.1.1",
    "eslint-plugin-react": "^7.3.0",
    "gh-pages": "^1.1.0",
    "html-loader": "^0.5.1",
    "html-webpack-plugin": "^3.2.0",
    "node-sass": "^4.12.0",
    "sass-loader": "^6.0.6",
    "style-loader": "^0.18.2",
    "webpack": "^4.26.1",
    "webpack-cli": "^3.1.2",
    "webpack-dev-server": "^3.1.10"
  },
  "dependencies": {
    "net": "^1.0.2",
    "react": "16.2",
    "react-dom": "16.2",
    "react-redux": "^5.0.6",
    "redux": "^3.7.2",
    "redux-logger": "^3.0.6",
    "redux-promise": "^0.6.0",
    "roslib": "^1.1.0"
  },
  "scripts": {
    "start": "webpack-dev-server --mode development --host 0.0.0.0",
    "lint": "eslint './src/**/*.js' './src/**/*.jsx'",
    "deploy": "webpack -p && gh-pages -d dist"
  }
}

这是我的 Dockerfile:

# Docker Image which is used as foundation to create
# a custom Docker Image with this Dockerfile
FROM node:10
 
# A directory within the virtualized Docker environment
# Becomes more relevant when using Docker Compose later
WORKDIR /usr/src/app
 
# Copies package.json and package-lock.json to Docker environment
COPY package*.json ./
 
# Installs all node packages
RUN npm install
 
# Copies everything over to Docker environment (except the .dockerignore files {cf bellow})
COPY . .
 
# Uses port which is used by the actual application
EXPOSE 8080
 
# Finally runs the application
CMD [ "npm", "start" ]

您认为错误消息来自哪里?

这是我用来构建和运行容器的命令:

docker build -t front-end .

docker run -tid --name front-end front-end
       

然后我检查了日志:

docker logs front-end

这是 .dockerignore :

/node_modules

标签: node.jsdockernpmwebpack

解决方案


如果没有错误产生的实际代码,就很难查明问题所在。如果由于某种原因您不能公开分享您的代码,您可以尝试以下方法:

  1. 使用 docker 调试 docker 映像中的问题,它为您提供 shell 访问权限。
docker run -it [IMAGE_ID] sh
  1. 如果遵循正确的套管,请检查您的进口。显然有些人遇到了类似的问题,在 OSX 中导入的模块不区分大小写,但在 linux 中则不然。

https://github.com/JeffreyWay/laravel-mix/issues/1741

  1. 也许您要查找的包已安装在您的全局 npm 模块中,并且未包含在 package.json 中。这导致模块未安装在 docker 映像中。

希望这可以帮助。


推荐阅读