首页 > 解决方案 > 如何使用 Jenkins 管道从 docker-compose 创建 docker 映像?

问题描述

我正在尝试为 elasticsearch 构建一个 docker 映像并部署该映像(到 Azure 注册表并让它作为 Azure Web 应用程序运行)。

我用 . 做的很好Dockerfile,但不知道如何用docker-compose.yml文件做。

这是我的码头工人撰写:

version: '3.8'

services:
  elasticsearch:
    container_name: elasticsearch
    image: library/elasticsearch:6.8.15
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - backend


networks:
  backend:
    name: backend-network-elasticsearch

和我的 Jenkinsfile

pipeline {
  environment {
    APP = 'elasticsearch01'
    registry = "utilitaweb.azurecr.io/${APP}"
    registryUrl = "https://___.azurecr.io"
    registryCredential = 'azureregistry'
    dockerImage = ''
    buildNumber = "build_$BUILD_NUMBER"
  }
  agent any
  stages {
    stage('Building image') {
      steps{
        ???
      }
    }
    stage('Deploy Image') {
      steps{
        script {
            docker.withRegistry(registryUrl, registryCredential) {
                dockerImage.push()
                dockerImage.push(buildNumber)
            }
        }
      }
    }
  }
}

在构建步骤中我应该有什么?

以前我有过dockerImage = docker.build("${registry}:latest", "--build-arg APP=${APP} --build-arg -f Dockerfile .")或类似的,但显然这行不通。

我认为这是因为我对 Docker 而不是 Jenkins 缺乏了解。

标签: azuredockerjenkinsdocker-compose

解决方案


Docker Compose 使用 Dockerfiles 来构建镜像。在上面,docker-compose.yml您不是在构建图像,而只是使用从注册表中构建的图像(正如@David Maze 已经指出的那样)。

大多数人不会在生产中使用 compose 文件,除非他们使用 Swarm 模式。虽然它可以在生产环境中使用,但人们倾向于只在开发环境中使用 Docker Compose。

您有两个选择:a) 将 Docker 映像的构建与您的应用程序项目绑定,或者;b) 有一个单独的管道来构建你的 Docker 镜像,如果你有很多镜像,这是首选;

在 A 的情况下,只需在项目存储库中的某处有一个 Dockerfile,并在管道中创建阶段以构建、上传然后将该映像部署到容器编排器基础架构。它可以是 Docker 主机、Kubernetes 集群、Swarm、Fargate、ECS 等。在 B 的情况下,您已经有一个基础镜像,您将通过另一个 Dockerfile 将其导入到您的项目中。在这个辅助 Dockerfile 中,您很可能只需复制源代码。然后,只需将其上传到您的注册表,最后将其部署到您的基础架构。

此致。


推荐阅读