При сборке контейнера Docker в Ubuntu EC2 установка NPM не выполняется в одном и том же месте - PullRequest
0 голосов
/ 20 мая 2019

Я пытался создать несколько сценариев автоматизации сборки, которые будут запускаться заданием на моем сервере Jenkins в экземпляре Ubuntu EC2. Я хочу, чтобы скрипт удалил все свободные контейнеры и изображения, затем собрал новую версию моего образа и заменил работающий контейнер. Вот мой скрипт сборки:

# 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

Было несколько работ, которые я выполнял, которые работали очень хорошо. Но по какой-то причине сегодня сборка продолжает сбой при установке NPM в моем Dockerfile:

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. Если я пытаюсь создать образ докера внутри или снаружи jenkins, я всегда получаю это:

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

Я продолжаю получать какую-то ошибку о йорке, пока она не провалилась. Я понятия не имею, почему это происходит или как это исправить.

Редактировать: 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 голосов
/ 20 мая 2019

Глядя на ваши журналы (до того, как вы удалили их из исходного вопроса), я мог видеть, что у вас есть несколько ошибок в вашем скрипте сборки до шага в Dockerfile, где вы делаете npm install.Например, sudo не удался, тест с [ также не удался, чтобы упомянуть некоторые из них.

Этот скрипт сборки на самом деле очень плохо написан, так как он никогда не проверяет ошибки.Любая проблема будет просто проигнорирована.Когда важная команда может потерпеть неудачу, вы должны проверить код возврата ($?) равным нулю, прежде чем продолжить.Другой вариант - остановить любую ошибку, используя set -e в самом начале скрипта.

Что касается других ошибок, вам недостаточно информации, чтобы помочь вам.Пожалуйста, обновите вопрос с полными журналами, как они были раньше (просто удалите важные части) и с содержимым вашего package.json.Также необходимо проверить версию npm и nodejs, запущенную на Jenkins и на вашем компьютере, и проверить, совпадают ли они.


Изменить после повторного добавления журналов к вопросу:

Глядя на эти строки ваших журналов:

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 к команде.Таким образом, он ничего не выведет, если изображение не найдено.Измените эту строку, чтобы она выглядела так:

if [ -n "$(docker images -q $_imagetag)" ]; then
    removeOldImage
fi

buildImage

... но это не единственная проблема, которая у вас есть.Я также вижу контейнер, использующий это изображение ... и я даже не проверял package.json.

...