Gitlab CI / CD,Docker Compose和应用程序

时间:2018-06-01 06:50:30

标签: performance docker docker-compose gitlab gitlab-ci

我有一个问题。

我最近进入了CI / CD,对我来说一个很好的起点是Gitlab,因为它们提供了一个简单的界面,我开始了解管道和阶段是什么,但我遇到了某种矛盾的想法关于在Docker上运行的Gitlab CI。

我的应用程序在Docker Compose上运行。它包含(blah blah),使其易于构建和运行容器。 Docker Compose中的每个服务都创建了一个Docker容器,除了php-fpm之外,它能够执行名为"水平缩放"的东西,所以我可以稍后扩展它。

我将使用Docker Compose进行制作,我目前正在开发中使用它,我也希望在CI / CD管道中使用它。

然而.gitlab-ci.yml只支持一个图像,因此我必须构建它并将其推送到Gitlab Registry或Docker Hub,以便稍后在CI / CD过程中提取它

如何将Docker Compose的服务构建为单个图像,以便将其推送到Registry / Docker,以便将其拉入CI / CD?

我的项目包含一个docker文件夹和一个docker-compose.yml。在docker文件夹中,每个服务都有自己独立的目录(php-fpm,nginx,mysql等),每一个(自己准备)包含一个带有构建细节的Dockerfile,特别是php-fpm(deps和libs很强)用这一个)

docker-compose.yml中的每个服务在每个文件夹中都有一个构建上下文。

如果我不清楚,我可以提供额外的信息(免费)

3 个答案:

答案 0 :(得分:0)

我认为你搜索的是这样的东西

# .gitlab-ci.yml

image: docker

services:
  - docker:dind

build:
  script:
    - apk add --no-cache py-pip
    - pip install docker-compose
    - docker-compose up -d

也很高兴知道:

答案 1 :(得分:0)

您不需要dind来运行docker-compose堆栈。您可以运行多个docker-compose up命令。

acceptance_testing:
  stage: test
  before_script:
    - docker-compose -p $CI_JOB_ID up -d
  script:
    - docker-compose -p $CI_JOB_ID exec -T /run/your/test/suite.sh
  after_script:
    - docker-compose -p $CI_JOB_ID down -v --remove-orphans || true

答案 2 :(得分:0)

  

但是.gitlab-ci.yml仅支持一张图片

这不是事实。来自official documentation

  

您的图片将按照以下方案命名:

<registry URL>/<namespace>/<project>/<image>
     

GitLab支持多达三个级别的图像存储库名称。   以下图像标签示例有效:

registry.example.com/group/project:some-tag
registry.example.com/group/project/image:latest
registry.example.com/group/project/my/image:rc1

因此,解决问题的方法很简单-只需构建单个图像,然后将它们以不同的图像名称推送到GitLab容器注册表即可。以下配置应该给您一个想法:

.template: &build_template
  image: docker:stable
  services:
    - docker:dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker pull $CI_REGISTRY_IMAGE/$IMAGE_NAME:latest || true
    - if [ -z ${CI_COMMIT_TAG+x} ];
      then docker build
        --cache-from $CI_REGISTRY_IMAGE/$IMAGE_NAME:latest
        --file $DOCKERFILE_NAME
        --tag $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHA
        --tag $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_TAG
        --tag $CI_REGISTRY_IMAGE/$IMAGE_NAME:latest . ;
      else docker build
        --cache-from $CI_REGISTRY_IMAGE/$IMAGE_NAME:latest
        --file $DOCKERFILE_NAME
        --tag $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHA
        --tag $CI_REGISTRY_IMAGE/$IMAGE_NAME:latest . ;
      fi
    - docker push $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHA
    - if [ -z ${CI_COMMIT_TAG+x} ]; then
        docker push $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_TAG;
      fi
    - docker push $CI_REGISTRY_IMAGE/$IMAGE_NAME:latest

build:image1:
  <<: *build_template
  variables:
    IMAGE_NAME: image1
    DOCKERFILE_NAME: Dockerfile.1

build:image2:
  <<: *build_template
  variables:
    IMAGE_NAME: image2
    DOCKERFILE_NAME: Dockerfile.2

并且您应该能够在以后的管道作业或撰写文件中使用$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHA提取相同的图像(前提是将变量传递到运行撰写文件的位置)。