我有一个问题。
我最近进入了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中的每个服务在每个文件夹中都有一个构建上下文。
如果我不清楚,我可以提供额外的信息(免费)
答案 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
提取相同的图像(前提是将变量传递到运行撰写文件的位置)。