我一直在尝试创建一些构建自动化脚本,以由作业在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"
]
}
答案 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。