AWS EC2 不断退出 Docker 容器(Jenkins 管道)

问题描述 投票:0回答:1

我的 Jenkins 多分支管道设置为将 NodeJS 应用程序的 Docker 映像构建/部署到 EC2 实例。一切似乎都正常,除了 docker 容器在创建后立即退出。它似乎也没有像应有的那样打开端口 3000。

图像通过

docker images
正确显示,并显示为按照 Jenkinsfile 增量阶段正确增量。

我只能看到封闭的容器

docker ps -a

在每次构建管道之前,我将使用

docker rm $(docker ps -a -q)
&&
docker rmi $(docker images -a -q)
删除所有 docker 映像和容器。每次都会出现同样的问题。

docker logs <containerID>
给出了一个关于无法找到模块的错误,所以我猜这与我的 Dockerfile 有关?我将附上所有内容,以确保它不是另一个文件中的奇怪错误。

Dockerfile

FROM node:10-alpine

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

USER node

RUN npm install

COPY --chown=node:node . .

EXPOSE 3000

CMD [ "node", "server.js" ]

应用程序文件夹

images
index.html
package-lock.json
package.json
server.js
server.test.js

docker 日志

internal/modules/cjs/loader.js:638
    throw err;
    ^


Error: Cannot find module '/home/node/app/server.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

docker-compose.yaml

version: '3.8'
services:
    nodejs-app:
      image: <docker-ID>/<docker-repo>:${IMAGE}
      ports:
        - "3000:3000"

服务器cmd.sh

#!/usr/bin/env bash

export IMAGE=$1
docker-compose -f docker-compose.yaml up --detach
echo "success"

Jenkins文件

#!/usr/bin/env groovy

pipeline {
    agent any
    tools {
        nodejs "node"
      }
    stages {
        stage('increment version') {
            when {
                expression {
                    return env.GIT_BRANCH == "main"
                }
            }
            steps {
                script {
                    dir("app") {
                        echo "incrementing app version..."
                        sh "npm version minor"
                        def packageJson = readJSON file: 'package.json'
                        def version = packageJson.version
                        env.IMAGE_NAME = "$version-$BUILD_NUMBER"
                    }
                }
            }
        }
        stage('Run tests') {
            steps {
                script {
                    dir("app") {
                        sh "npm install"
                        sh "npm run test"
                    }
                }
            }
        }
        stage('Build and Push docker image') {
            when {
                expression {
                    return env.GIT_BRANCH == "main"
                }
            }            
            steps {
                script {
                    echo "building the docker image..."
                    withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'PASS', usernameVariable: 'USER' )]) {
                    sh "docker build -t <docker-ID>/<docker-repo>:${IMAGE_NAME} ."
                    sh  "echo $PASS | docker login -u $USER --password-stdin"
                    sh "docker push <docker-ID>/<docker-repo>:${IMAGE_NAME}"
                    }
                }
            }
        }
        stage('deploy to EC2') {
            when {
                expression {
                    return env.GIT_BRANCH == "main"
                }
            }
            steps {
                script {
                   def shellCmd = "bash ./server-cmd.sh ${IMAGE_NAME}"
                   def ec2Instance = "ec2-user@<ec2-public-IP>"
                
                   sshagent(['ec2-server-key']) {
                       
                       sh "scp -o StrictHostKeyChecking=no server-cmd.sh ${ec2Instance}:/home/ec2-user"
                      
                       sh "scp -o StrictHostKeyChecking=no docker-compose.yaml ${ec2Instance}:/home/ec2-user"
                       sh "ssh -o StrictHostKeyChecking=no ${ec2Instance} ${shellCmd}"
                       
                   }     
                }
            }
        }
        stage('commit version update') {
            when {
                expression {
                    return env.GIT_BRANCH == "main"
                }
            }
            steps {
                script {
                    withCredentials([usernamePassword(credentialsId: 'gitlab', passwordVariable: 'PASS', usernameVariable: 'USER' )]) {
                    sh 'git config --global user.email "[email protected]" '
                    sh 'git config --global user.name "jenkins" '

                    sh "git status"
                    sh "git branch"
                    sh "git config --list"

                    sh "git remote set-url origin https://${USER}:${PASS}@gitlab.com/<gitlab-ID>/<gitlab-repo>.git"
                    sh "git add ."
                    sh 'git commit -m "jenkins: version bump"'
                    sh 'git push -f origin HEAD:main'
                    }
                }
            }
        }
    }
}


我尝试了几种不同的 Dockerfile 配置。这是唯一一个可以让管道以完全绿色阶段完成构建并且构建日志中没有错误/警告/提示的方法。

这也是将映像获取到 EC2 实例并至少暂时启动它的唯一配置。

我只剩下

docker logs <containerID>
作为我可能出错的唯一指示。此时我不知道如何正确配置 Dockerfile。任何意见将不胜感激!

node.js docker jenkins amazon-ec2 dockerfile
1个回答
0
投票

问题出在 Dockerfile

CODE
行之一。我指的是错误的位置。应该是
COPY --chown=node:node ./app .

删除了多余的

COPY package*.json ./
行。

FROM
行更改为
node:20-Apline
以对抗弃用警告。

似乎之前没有显示端口 3000,因为它从未真正启动过。

这是我清理后的代码:

Dockerfile

FROM node:20-alpine

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY --chown=node:node ./app .

USER node

RUN npm install

EXPOSE 3000

CMD [ "node", "server.js" ]
© www.soinside.com 2019 - 2024. All rights reserved.