在Ubuntu EC2上构建Docker容器时,NPM安装会一直失败。

时间:2019-05-19 22:17:05

标签: shell docker ubuntu jenkins npm

我一直在尝试创建一些构建自动化脚本,以由作业在Ubuntu EC2实例上的Jenkins服务器上运行。我希望脚本删除所有松散的容器和图像,然后构建图像的新版本并替换正在运行的容器。这是我的构建脚本:

# Granting superuser
sudo -i

# Initializing Variables
_imagetag=nurenui-v1

# Initializing functions
buildImage()
{    
    docker build -t "$_imagetag" .
}

removeOldImage()
{
    docker rmi $_imagetag
}

pruneImagesAndContainers()
{
    docker container prune --force
    docker image prune --force
}

pruneImagesAndContainers

if [ "$(docker images $_imagetag)" == "" ]; then
    buildImage
else
    removeOldImage
    buildImage
fi

我从事的一些工作效果很好。但是由于某些原因,今天,该构建在我的Dockerfile中的NPM安装上仍然失败:

FROM node as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install 
COPY . .
RUN npm run build 

FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

NPM安装在我的机器上可以正常工作,但由于仍在Win8上,因此无法在其上测试docker。如果我尝试在jenkins内部或外部构建docker映像,我总是会得到以下提示:

17:30:22 Started by GitHub push by ObsidianTech
17:30:22 Building in workspace /var/lib/jenkins/workspace/UI/NuRenUI
17:30:22 [WS-CLEANUP] Deleting project workspace...
17:30:22 [WS-CLEANUP] Deferred wipeout is used...
17:30:22 [WS-CLEANUP] Done
17:30:22 using credential ab9c5d12-0a8d-4edb-9be4-83813cf29068
17:30:22 Cloning the remote Git repository
17:30:22 Cloning repository https://github.com/ObsidianTech/NuRenPivot.git
17:30:22  > git init /var/lib/jenkins/workspace/UI/NuRenUI # timeout=10
17:30:22 Fetching upstream changes from https://github.com/ObsidianTech/NuRenPivot.git
17:30:22  > git --version # timeout=10
17:30:22 using GIT_ASKPASS to set credentials 
17:30:22  > git fetch --tags --progress https://github.com/ObsidianTech/NuRenPivot.git +refs/heads/*:refs/remotes/origin/*
17:30:23  > git config remote.origin.url https://github.com/ObsidianTech/NuRenPivot.git # timeout=10
17:30:23  > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
17:30:23  > git config remote.origin.url https://github.com/ObsidianTech/NuRenPivot.git # timeout=10
17:30:23 Fetching upstream changes from https://github.com/ObsidianTech/NuRenPivot.git
17:30:23 using GIT_ASKPASS to set credentials 
17:30:23  > git fetch --tags --progress https://github.com/ObsidianTech/NuRenPivot.git +refs/heads/*:refs/remotes/origin/*
17:30:24  > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
17:30:24  > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
17:30:24 Checking out Revision 53e55914222b3f53f173e313d2dc8c7c10746083 (refs/remotes/origin/master)
17:30:24  > git config core.sparsecheckout # timeout=10
17:30:24  > git checkout -f 53e55914222b3f53f173e313d2dc8c7c10746083
17:30:24 Commit message: "trying to fix npm issue"
17:30:24  > git rev-list --no-walk b01ea4d30b391f700a0c597a20bbb5ff6e6f552d # timeout=10
17:30:24 [NuRenUI] $ /bin/sh -xe /tmp/jenkins6764800963704352013.sh
17:30:24 + ls
17:30:24 Dockerfile
17:30:24 README.md
17:30:24 babel.config.js
17:30:24 package-lock.json
17:30:24 package.json
17:30:24 public
17:30:24 qaBuild.sh
17:30:24 qaDeploy.sh
17:30:24 src
17:30:24 + chmod 777 ./qaBuild.sh
17:30:24 + chmod 777 ./qaDeploy.sh
17:30:24 + ./qaBuild.sh
17:30:28 Deleted Containers:
17:30:28 9cd52dadac2f379dffc630d01f0ade2069b0a5683a0dce2c2261490529f75db6
17:30:28 
17:30:28 Total reclaimed space: 138.6MB
17:30:28 Deleted Images:
17:30:28 deleted: sha256:0fbd6c6b36a785ecebe8f9ecc971e7645ef209a7a62de4996b773a37bee6b4a4
17:30:28 deleted: sha256:ba7d8f555b9eb7cf15dbda40569efe6171bddeeeaa0deced3816217690943f21
17:30:28 deleted: sha256:0ce9c7023bc64f5798954340ae9b44d9afe231b3e724351059dbd275e9e98c87
17:30:28 deleted: sha256:8b626fa0dcd67eab716ed8999e0fdbfe063c630685f7a77dfb592f15df93198c
17:30:28 
17:30:28 Total reclaimed space: 421.3kB
17:30:28 ./qaBuild.sh: 23: [: REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
17:30:28 nurenui-v1          latest              c6fd05d82c12        13 hours ago        43.7MB: unexpected operator
17:30:28 Error response from daemon: conflict: unable to remove repository reference "nurenui-v1" (must force) - container e300a467c2e0 is using its referenced image c6fd05d82c12
17:30:29 Sending build context to Docker daemon  67.87MB

17:30:29 Step 1/10 : FROM node:latest as build-stage
17:30:29  ---> 502d06d3bfdf
17:30:29 Step 2/10 : WORKDIR /app
17:30:29  ---> Running in d12805e29d2e
17:30:30 Removing intermediate container d12805e29d2e
17:30:30  ---> 4f573ab1b889
17:30:30 Step 3/10 : COPY package*.json ./
17:30:30  ---> 9fc9cb7ed731
17:30:30 Step 4/10 : RUN npm install
17:30:30  ---> Running in 70fe3d18ecc4
17:31:03 
17:31:03 > yorkie@2.0.0 install /app/node_modules/yorkie
17:31:03 > node bin/install.js
17:31:03 
17:31:03 [91m
17:31:03 [0mThe command '/bin/sh -c npm install' returned a non-zero code: 1
17:31:05 Build step 'Execute shell' marked build as failure
17:31:05 Finished: FAILURE

在yorkie失败之前,我不断收到一些错误。我不知道为什么会这样或如何解决。

编辑:package.json

{
  "name": "nurenpivot",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "core-js": "^2.6.5",
    "vue": "^2.6.6",
    "vue-router": "^3.0.4",
    "vuex": "^3.1.0"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^3.5.0",
    "@vue/cli-plugin-eslint": "^3.5.0",
    "@vue/cli-service": "^3.5.0",
    "babel-eslint": "^10.0.1",
    "eslint": "^5.8.0",
    "eslint-plugin-vue": "^5.0.0",
    "vue-template-compiler": "^2.5.21"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "rules": {},
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },
  "postcss": {
    "plugins": {
      "autoprefixer": {}
    }
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}

1 个答案:

答案 0 :(得分:0)

查看日志(在从原始问题中删除日志之前),我发现在执行Dockerfile的{​​{1}}步骤之前,您的构建脚本方式存在一些错误。例如,npm install失败了,sudo的测试也失败了。

这个构建脚本实际上写得很差,因为它从不检查错误。任何问题都将被忽略。当重要命令失败时,您必须先检查返回码([)是否等于零,然后再继续操作。您还有另一个选择,就是在脚本的开头使用$?停止发生任何错误。

对于其他错误,没有足够的信息来帮助您。请使用完整的日志来更新问题,就像以前一样(只需删除敏感部分)以及set -e的内容即可。还需要检查在Jenkins和您的计算机上运行的npm和nodejs版本,以检查它们是否匹配。


将日志重新添加到问题后进行编辑:

查看日志的以下几行:

package.json

很明显,您正在使用命令17:30:28 ./qaBuild.sh: 23: [: REPOSITORY TAG IMAGE ID CREATED SIZE 17:30:28 nurenui-v1 latest c6fd05d82c12 13 hours ago 43.7MB: unexpected operator 17:30:28 Error response from daemon: conflict: unable to remove repository reference "nurenui-v1" (must force) - container e300a467c2e0 is using its referenced image c6fd05d82c12 的原始输出,肯定不是您想要的不是。如果您尝试使用此命令,您将看到输出包含许多其他信息,例如标题,大小,标签等。即使图像不存在,它也会输出标题行。字面意思是日志告诉您的信息,像这样:

docker images $_imagetag

要执行此检查,必须在命令中添加REPOSITORY TAG IMAGE ID CREATED SIZE nurenui-v1 latest c6fd05d82c12 13 hours ago 43.7MB 。这样,如果找不到图像,它将不会输出任何内容。更改该行,使其看起来像这样:

-q

...但这不是您遇到的唯一问题。我还可以看到一个使用该图像的容器...我什至没有检查package.json。