【问题标题】:Integrating docker with gitlab-ci - how does the docker image get built and used?将 docker 与 gitlab-ci 集成 - 如何构建和使用 docker 映像?
【发布时间】:2018-07-05 15:11:59
【问题描述】:

我以前使用 shell 为我的 gitlab 运行程序构建我的项目。到目前为止,我已经设置了管道,它将运行我在 gitlab-ci.yml 文件中设置的任何命令,如下所示:

gitlab-ci.yml 使用 shell 运行器

before_script:
  - npm install
  - npm install --save @angular/material @angular/cdk

cache:
  paths:
    - node_modules/

stages:
  - dev
  - staging
  - production

build_dev:
  stage: dev

  script:
    - rm ./package-lock.json
    - npm run build 
    - ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false

现在,我想切换到 docker 映像。我已将运行器重新配置为使用 docker 映像,并在我的新 gitlab-ci.yml 文件中指定了该映像,如下所示。我遵循了 gitlab-ci docker 教程,这就是它停止的地方,所以我不完全确定从这里去哪里:

gitlab-ci.yml 使用 docker runner

image: node:8.10.0

before_script:
  - npm install
  - npm install --save @angular/material @angular/cdk

cache:
  paths:
    - node_modules/

stages:
  - dev
  - staging
  - production

build_dev:
  stage: dev

  script:
    - rm ./package-lock.json
    - npm run build 
    - ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false

问题:

  1. 使用我当前的 gitlab-ci.yml 文件,它如何构建一个 docker 镜像/它甚至可以构建一个吗?如果是这样,那是什么意思?目前管道通过了,但我不知道它是否在 docker 映像中进行(我应该能够分辨吗?)。

    另外,假设创建了 docker 映像,运行了测试,并且管道通过了;它应该将代码推送到新的存储库(尚未包含在 yml 文件中)。从我收集的信息来看,图像没有被推送,只是代码,对吧?那么我该如何处理这个创建的 docker 镜像呢?

  2. 如何使用 Dockerfile?我看不到 gitlab-ci.yml 文件和 Dockerfile 之间的链接。

  3. 我是否需要将 gitlab-ci.yml 文件中的所有命令包围在 docker run <commands>docker exec <commands> 中?如果不包含这两个命令之一,它似乎只会在服务器上运行,而不是在 docker 映像中。

  4. 我看到人们在 gitlab-ci.yml 文件和 Dockerfile 中都指定了一个图像。我有一个角度项目,我指定了image: node:8.10.0 的图像。在 Dockerfile 中,我应该指定相同的图像吗?我见过一些完全不同的项目,我想知道这两个图像的用途是什么/如果选择一个图像而不是另一个图像会严重影响我的构建。

【问题讨论】:

    标签: docker gitlab gitlab-ci gitlab-ci-runner


    【解决方案1】:

    如果您想完全 dockerize,您必须采用不同的方法来构建您的应用程序。将有角度的东西导出到 Dockerfile 中,并在你的 .gitlab-ci 中获取 docker 操作,而不是像这里这样的有角度的东西:

    stages:
      - build
    #  - release
    #  - deploy
    
    .build_template: &build_definition
      stage: build
      image: docker:17.06
      services:
        - docker:17.06-dind
      script:
        - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
        - docker pull $CONTAINER_RELEASE_IMAGE || true
        - docker build --cache-from $CONTAINER_RELEASE_IMAGE -t $CONTAINER_IMAGE -f $DOCKERFILE ./
        - docker push $CONTAINER_IMAGE
    
    build_app_job:
      <<: *build_definition
      variables:
        CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/app:$CI_COMMIT_REF_SLUG
        CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/app:latest
        DOCKERFILE: ./Dockerfile.app
    
    build_nginx_job:
      <<: *build_definition
      variables:
        CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/nginx:$CI_COMMIT_REF_SLUG
        CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/nginx:latest
        DOCKERFILE: ./Dockerfile
    

    您可以设置一些构建作业 - 用于生产、开发、登台等。 在您的 .gitlab-ci.yaml 旁边,您可以放置​​ DockerfileDockerfile.app - Dockerfile.app 代表构建您的 Angular 应用程序:

    FROM node:10.5.0-stretch
    RUN mkdir -p /usr/src/app
    RUN mkdir -p /usr/src/remote
    WORKDIR /usr/src/app
    COPY . .
    # do your commands here
    

    现在,随着您的应用构建完成,它可以通过网络服务器提供服务 - 这是您的选择,并且每个选择都遵循不同的配置 - 甚至不能在这里触及表面。这将在Dockerfile 中实现——我们公司通常使用 Nginx。

    从这里开始,就是发布您的图像并进行部署。我只指定了如何在 docker 中构建它们,因为这似乎是问题所在。

    如果您想部署您的映像并在某处运行它 - 选择一个提供商 - AWS、Heroku、自己的基础设施 - 随心所欲,但这太过分了,无法在一个答案中涵盖所有这些,所以我会离开当您指定要在哪里部署新构建的图像以及您希望如何提供它时,这是另一个问题。在我们公司,我们使用 Rancher 进行协调,但市场上有多种很棒的竞争选择。


    编辑自定义注册表

    上述.gitlab-ci 配置仅适用于 Gitlab 的“内部”注册表,如果您想使用自己的注册表,请相应地更改值:

    #previous configs
    script:
            - docker login -u mysecretlogin -p mysecretpasswd registry.local.com
            # further configs
    
    • -u gitlab-ci-token 到您在注册表中的登录名,
    • $CI_JOB_TOKEN到你的密码
    • $CI_REGISTRY 到您的注册地址

    这些值应该存储在 Gitlab 的 CI secret variables 中并通过 env 变量引用,这样它们就不会保存在存储库中。

    最后,如果您决定保护这些值,您的脚本可能如下所示。参考 Gitlab 的official docs on how to add secret CI variables - 超级简单的任务。

    #previous configs
    script:
            - docker login -u $registrylogin -p $registrypasswd $registryaddress
            # further configs
    

    【讨论】:

    • 经过大量尝试和阅读另一个教程后,我遇到了运行此命令的问题:- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY。它建议我使用--password-stdin,但使用它的唯一方法是从文件中输入密码,如下所示:cat ~/my_password.txt | docker login --username foo --password-stdin。有没有办法通过gitlabs“秘密变量”部分使用加密密码?
    • 只是为了澄清 - 你没有使用 gitlab 的注册表?
    • 在我提出问题后,我建立了自己的本地注册表。
    • 所以当我运行这个命令时它说:$ docker login -u gitlab-ci-token --password-stdin $CI_JOB_TOKEN $CI_REGISTRY "docker login" requires at most 1 argument.
    • 上述方法仅适用于 gitlab 的注册表,如果您想使用自己的注册表,请相应地将值从 gitlab-ci-token 更改为您在注册表中的登录名,$CI_JOB_TOKEN 更改为您的密码和 @ 987654342@ 到您的注册表公共地址 - 它们应该存储在 gitlab 的机密中并通过 env 变量引用,以便它们不会保存在存储库中。如果不清楚,我可以对其进行更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2021-04-07
    • 2021-12-29
    • 2022-07-27
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多