当前位置: 首页 > 面试题库 >

如何使用Gitlab CI构建,推送和拉取多个Docker容器?

郭思淼
2023-03-14
问题内容

我有一个docker-
compose文件,该文件构建了两个容器,一个节点应用程序和一个ngnix服务器。现在,我想在Gitlab运行程序的帮助下在服务器上自动化构建和运行过程。我对与CI相关的事物还很陌生,因此请原谅我的方法:

我想在gitlab.com上创建多个存储库,并为每个存储库创建一个Dockerfile。我现在是否必须将gitlab-
runner实例与这些项目中的每一个相关联才能构建映像,将其推送到docker repo并让服务器从那里拉出它?然后,我不得不以某种方式将docker-
compose文件推送到服务器上,然后从那里组成所有内容。

所以我的问题是:

  1. 我可以在一台服务器上为我的所有存储库运行多个(2或3)gitlab-runner吗?
  2. 我需要一个特定的或共享的跑步者吗,区别到底是什么?
  3. 为什么所有教程都使用自托管的Gitlab实例而不是仅使用gitlab仓库(是否无法将gitlab-runner与gitlab.com仓库一起使用?)
  4. 是否可以在gitlab-runner管道中使用docker-compose并立即构建所有内容?

问题答案:

首先,您显然可以在https://gitlab.com以及自托管的GitLab实例上使用GitLab CI /
CD功能。除了您要注册运行程序的主机之外,它没有任何改变:

  • https://gitlab.com/以防万一您使用GitLab而不托管它
  • https:// your-custom-domain /如果您托管自己的GitLab实例

您可以根据需要添加任意数量的运行程序(我认为是这样,并且每个项目至少有5-6个运行程序没有问题)。您只需要为您的项目注册每个赛跑者。为此,请参阅注册跑步者。

至于共享跑步者还是特定跑步者,如果您想尝试GitLab CI / CD,我认为您应该坚持分享跑步者。

GitLab.com上的共享跑步者以自动缩放模式运行,并由DigitalOcean提供支持。自动扩展意味着减少了启动构建的等待时间,并为每个项目隔离了VM,从而最大程度地提高了安全性。

它们可免费用于公共开源项目,对于私人项目,每个组每月限制为2000 CI分钟。阅读有关所有GitLab.com计划的信息。

不过,您可以在任何机器上安装自己的跑步机,例如laptotp。您可以将其与Docker一起部署以快速入门。

最后,是的,gitlab-ci.yml如果您使用sshexecutor并已docker- compose安装在服务器上,则可以在文件中使用docker-compose
。但是我建议使用docker执行程序并使用docker:dind(Docker中的Docker)映像

Docker中的Docker是什么?

尽管通常不建议在Docker内部运行Docker,但是>有一些合理的用例,例如Docker本身的开发。

这是一个示例用法,docker-compose尽管没有:

image: docker:latest

services:
  - name: docker:dind
    command: ["--experimental"]


before_script:
  - apk add --no-cache py-pip      # <-- add python package install pip
  - pip install docker-compose     # <--- add docker-compose 
  - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin    # <---- Login to your registry

build-master:
  stage: build
  script:
    - docker build --squash --pull -t "$CI_REGISTRY_USER"/"$CI_REGISTRY_IMAGE":latest .
    - docker push "$CI_REGISTRY_USER"/"$CI_REGISTRY_IMAGE":latest
  only:
    - master

build-dev:
  stage: build
  script:
    - docker build --squash --pull -t "$CI_REGISTRY_USER"/"$CI_REGISTRY_IMAGE":"$CI_COMMIT_REF_SLUG" .
    - docker push "$CI_REGISTRY_USER"/"$CI_REGISTRY_IMAGE":"$CI_COMMIT_REF_SLUG"
  except:
    - master

如您所见,我构建了Docker映像,对其进行了标记,然后将其推送到我的Docker注册表中,但是您可以推送到任何注册表。当然,您可以随时在script声明中使用docker-
compose

我的Git存储库如下所示:

/my_repo
|---- .gitignore    
|---- .gitlab-ci.yml    
|---- Dockerfile    
|---- README.md

我的跑步者的config.toml看起来像:

[[runners]]
  name = "4Gb digital ocean vps"
  url = "https://gitlab.com"
  token = "efnrong44d77a5d40f74fc2ba84d8"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "docker:dind"
    privileged = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    shm_size = 0
  [runners.cache]

您可以查看https://docs.gitlab.com/runner/configuration/advanced-
configuration.html以获得有关Runner配置的更多信息。

注意:这里使用的所有变量都是 秘密变量
。有关说明,请参见https://docs.gitlab.com/ee/ci/variables/

我希望它能回答您的问题



 类似资料:
  • 使用Compose,如果我运行,它将重建所有容器: 即使在使用缓存重建时,这也需要时间。所以我的问题是: 有没有办法只重建一个特定的容器?

  • 我正在使用JGit克隆存储库,对文件进行一些更改,提交,标记它,然后将其推送到远程存储库。 我已经使用JGit编写了代码,它将克隆存储库,在文件中进行一些更改,然后提交更改,创建新标记,并推送提交和标记。 推送后,我希望远程存储库显示我的更改和新标签,但是在远程存储库中显示的是带有提交的更改,但是标签不可见。它显示“无标签”。

  • 我必须在docker环境中构建yolact(我使用sagemaker笔记本)。就像这样 而我想经营这个 但我有一个错误: 但是环境支持CUDA。有人知道问题出在哪里吗? 谢谢你。

  • 问题内容: 我正在寻找构建表示已经存在的公司数据库的dockerfile。同样,我想创建一个从还原psql转储开始的docker文件。 我在目录中。 我认为这样做就足够了。我想避免使用脚本的解决方案。 我使用template0,因为psql文档说您需要与原始数据库中创建的用户相同,并且需要在还原之前使用template0创建数据库。 但是,这给了我一个错误: 我还在整个应用程序中使用docker

  • 我有一个简单的SpringBoot应用程序,我想使用Jib Maven插件构建docker映像。以下是我的插件配置: 我只想在本地构建映像并运行它。我不想一次建成并推送到docker注册表。 当我运行命令mvnjib:build时,它会使用Docker config(/Users/username/.Docker/config.json)中的凭据自动推送到DockerHub。 有没有一种方法我可以

  • 问题内容: 我要做的是为我的Java应用程序构建一个docker映像,但是以下注意事项对于大多数编译语言都应适用。 在构建服务器上,我想为应用程序生成一个docker映像作为可交付成果。为此,我必须使用一些构建工具(通常是Gradle,Maven或Ant)来编译应用程序,然后将创建的JAR文件添加到docker映像中。因为我希望Docker映像仅执行JAR文件,所以我当然将从已安装Java的基本映