来自 Docker 映像的 Bitbucket 管道缺少 NPM 模块

Posted

技术标签:

【中文标题】来自 Docker 映像的 Bitbucket 管道缺少 NPM 模块【英文标题】:Bitbucket Pipelines from Docker Image has Missing NPM Modules 【发布时间】:2018-09-08 17:53:20 【问题描述】:

问题

我的Dockerfilebitbucket-pipelines.yml 有什么问题?为什么 bitbucket 管道环境中缺少模块?

错误

当我尝试使用 Bitbucket Pipelines 使用 webpack npm run build 我的 Vue2 项目时,我收到有关缺少模块的错误。

来自日志

npm run build
> people-is@1.0.0 build /opt/atlassian/pipelines/agent/build
> node build/build.js
module.js:549
    throw err;
    ^
Error: Cannot find module 'cli-spinners'

文件

这里是配置文件。

Dockerfile - 构建 cportwine/people-is

FROM node:8.10.0

RUN npm install
RUN npm install -g firebase-tools

CMD [ "npm", "run", "build" ]

bitbucket-pipelines.yml

image:
  name: cportwine/people-is
pipelines:
  default:
    - step:
        script:
          - npm run build

package.json


  "name": "people-is",
  "version": "1.0.0",
  "description": "A Vue.js project",
  "author": "cportwine",
  "private": true,
  "scripts": 
    "dev": "node build/dev-server.js",
    "start": "node build/dev-server.js",
    "build": "node build/build.js",
    "deploy": "firebase deploy --token $FIREBASE_TOKEN"
  ,
  "dependencies": 
    "rxjs": "^5.5.8",
    "uuid": "^3.2.1",
    "vue": "^2.5.16",
    "vue-json-excel": "^0.1.9",
    "vue-router": "^2.8.1",
    "vue-rx": "^5.0.0",
    "vuefire": "^1.4.5",
    "vuetify": "^0.15.2"
  ,
  "devDependencies": 
    "autoprefixer": "^7.2.6",
    "babel-core": "^6.22.1",
    "babel-loader": "^7.1.4",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-stage-2": "^6.22.0",
    "babel-register": "^6.22.0",
    "chalk": "^2.3.2",
    "connect-history-api-fallback": "^1.5.0",
    "copy-webpack-plugin": "^4.5.1",
    "css-loader": "^0.28.11",
    "cssnano": "^3.10.0",
    "eslint": "^4.19.1",
    "eslint-config-standard": "^11.0.0",
    "eslint-friendly-formatter": "^3.0.0",
    "eslint-loader": "^1.9.0",
    "eslint-plugin-html": "^4.0.2",
    "eslint-plugin-promise": "^3.7.0",
    "eslint-plugin-standard": "^3.0.1",
    "eventsource-polyfill": "^0.9.6",
    "express": "^4.16.3",
    "extract-text-webpack-plugin": "^2.0.0",
    "file-loader": "^0.11.1",
    "firebase": "^4.12.0",
    "firebase-tools": "^3.17.7",
    "friendly-errors-webpack-plugin": "^1.1.3",
    "html-webpack-plugin": "^2.28.0",
    "http-proxy-middleware": "^0.17.3",
    "opn": "^5.3.0",
    "optimize-css-assets-webpack-plugin": "^2.0.0",
    "ora": "^1.4.0",
    "rimraf": "^2.6.0",
    "semver": "^5.5.0",
    "shelljs": "^0.7.6",
    "url-loader": "^0.5.8",
    "vue-loader": "^13.7.1",
    "vue-style-loader": "^3.1.2",
    "vue-template-compiler": "^2.5.16",
    "vuex": "^2.5.0",
    "webpack": "^2.6.1",
    "webpack-bundle-analyzer": "^2.11.1",
    "webpack-dev-middleware": "^1.12.2",
    "webpack-hot-middleware": "^2.21.2",
    "webpack-merge": "^4.1.2"
  ,
  "engines": 
    "node": ">=8.10.0",
    "npm": ">= 5.6.0"
  ,
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ],
  "main": "index.js",
  "repository": 
    "type": "git",
    "url": "git+https://chaddportwine@bitbucket.org/jahnelgroup/people-is.git"
  ,
  "keywords": [],
  "license": "ISC",
  "homepage": "https://bitbucket.org/jahnelgroup/people-is#readme"

我看到了什么

当我在两个环境中ls node_modules 文件夹时,它们不匹配。 bitbucket 管道中缺少模块。

本地文件夹

people-is/node_modules

...
chalk
char-spinner
chardet
check-types
chokidar
chownr
cipher-base
circular-json
cjson
clap
class-utils
clean-css
cli-boxes
cli-cursor
cli-spinners
cli-table
cli-table2
cli-width
cliui
...

bitbucket 文件夹

/opt/atlassian/pipelines/agent/build/node_modules

哇,缺少模块!

...
chalk
cli-cursor
co
...

我尝试过的

我在构建之前向bitbucket-pipelines.yml 添加了一个命令到npm install

bitbucket-pipelines.yml

image:
  name: cportwine/people-is
pipelines:
  default:
    - step:
        script:
          - npm install
          - npm run build

这会将一些额外的模块(例如错误中的cli-spinners)添加到/opt/atlassian/pipelines/agent/build/node_modules

bitbucket 文件夹

/opt/atlassian/pipelines/agent/build/node_modules

...
chalk
char-spinner
chardet
check-types
chokidar
chownr
cipher-base
circular-json
cjson
clap
class-utils
clean-css
cli-boxes
cli-cursor
cli-spinners
cli-table
cli-table2
cli-width
cliui
clone
clone-response
co
...

但是,由于缺少不同的模块,构建命令仍然失败。

错误

> people-is@1.0.0 build /opt/atlassian/pipelines/agent/build
> node build/build.js
module.js:549
    throw err;
    ^
Error: Cannot find module './_safeGet'

【问题讨论】:

您是否检查过两个环境中是否有相同版本的 node 和 npm? @BhushanBabar 是的,我明白了:本地 - node v8.10.0 npm 5.6.0;管道-node v8.10.0npm 5.6.0。为了获得我在bitbucket-pipelines.yml 文件中添加了- node --version- npm --version 的版本。有没有更好的方法来确认 Bitbucket Pipelines 中的版本? 不,没关系,尝试在 package.json 中将您的 dev dependencies 转换为 dependencies @BhushanBabar,我确实尝试将 all package.json 依赖项放在 devDependencies 中,这适用于这个 VueJS 项目,但是它对 bitbucket 没有影响管道建​​设。我找到了一个不同的解决方案来构建项目。该项目现在使用 dependenciesdevDependencies 中的依赖项构建。不过,我决定将它们全部移至devDependencies 我发现在bitbucket-pipeline.yml文件中,我必须先rm -r node_modules然后npm install -g npmnpm install。这会在node_modules 中安装所有必需的依赖项。 我不知道为什么我需要删除和安装任何东西。我认为 Docker Image 已经解决了这个问题,所以 Bitbucket Pipelines 不需要。 【参考方案1】:

解决方案

我现在可以构建应用程序,但我不知道为什么!

1 - 简化 Dockerfile

我删除了所有的 npm 命令。也许npm install 命令是多余的?使用 Docker Image 预安装 npm 包没有任何优势。

2 - 安装前删除 Node_Modules

使用bitbucket-pipelines.yml,删除node_modules文件夹,然后执行npm install -g npmnpm installnpm install -g firebase-tools

文件更改

bitbucket-pipelines.yml(添加行)

image:
  name: cportwine/people-is
pipelines:
  default:
    - step:
        script:
          - rm -r node_modules              <---- remove
          - npm install -g npm              <---- install
          - npm install                     <---- install
          - npm install -g firebase-tools   <---- install
          - npm run build

Dockerfile(已删除行)

FROM node:8.10.0

                                            <---- remove

CMD [ "npm", "run", "build" ]

回答?

我不知道为什么将所有 npm install 的东西移到 bitbucket.pipelines.yml 解决了我构建项目的问题。我认为 Docker 将使我能够定义我的环境,例如,安装一个版本的 node/npm 和 firebase。管道会“运行”它。

如果有人能解释我缺少什么,我会接受这个答案。

【讨论】:

【参考方案2】:

回答

我收到了来自 Atlassian 团队的 support

    npm install -g firebase 留在 docker 映像中。 将 npm install 从 docker 映像移动到 bitbucket-pipelines.yml 文件。

原因

node_modules 文件夹在.gitignore 中列出

tl;博士

我的错误 - 我忘记了 .gitignore 以及它如何影响源代码控制中的 node_modules 文件夹,例如 Bitbucket Pipelines。

我正在查看我的 local node_modules 文件夹并在本地构建它工作。

然而

源代码管理中的node_modules 与我的本地文件夹不同步,因为它包含在.gitignore 文件中。

所以

我有必要使用 bitbucket-pipelines.yml rm node_modulesnpm install。现在,BitPipes 找到了我在本地安装的模块。

这是维护package.json 的重点,但我很困惑。

【讨论】:

或使用npm ci --dev

以上是关于来自 Docker 映像的 Bitbucket 管道缺少 NPM 模块的主要内容,如果未能解决你的问题,请参考以下文章

如何从导出的 JSON 自动更新 Docker 映像中的 Grafana 仪表板(和数据源)?

来自 docker 映像的命令未传递到管道

在 bitbucket 上使用 git 部署到 Heroku

AWS Elastic Beanstalk Docker 来自 ECR 错误“Dockerrun.aws.json 中未指定 Docker 映像”

Cloudbuild - 使用来自不同步骤的自定义变量构建 docker 映像

CannotPullContainerError:来自守护程序的错误响应:ECR 存储库映像的拉取访问被拒绝,存储库不存在或可能需要“docker login”