将 docker 与 gitlab-ci 集成 - 如何构建和使用 docker 图像?

Integrating docker with gitlab-ci - how does the docker image get built and used?

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

gitlab-ci.yml 使用 shell 运行ner

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 图片。我已经重新配置 运行ner 以使用 docker 图像,并且我在我的新 gitlab-ci.yml 文件中对图像进行了 ci 验证,如下所示。我遵循了 gitlab-ci docker 教程,这是它停止的地方所以我不完全确定从这里去哪里:

gitlab-ci.yml 使用 docker 运行ner

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 image/does 它甚至构建一个?如果是,那是什么意思?目前管道通过了,但我不知道它是否在 docker 图像中通过(我应该能够分辨出来吗?)。

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

  2. Dockerfile如何使用?我在 gitlab-ci.yml 文件和 Dockerfile.

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

  4. 我看到有人在 gitlab-ci.yml 文件和 Dockerfile 中都使用 cify 图像。我有一个 angular 项目,我生成了 ci 图像 image: node:8.10.0。在 Dockerfile 中,我应该 specify 相同的图像吗?我见过一些完全不同的项目,我想知道两个图像的使用 are/if 选择一个图像而不是另一个图像会严重影响我的构建。

如果您想完全 docker 化您的应用程序,则必须采用不同的方法来构建您的应用程序。将 angular 内容导出到 Dockerfile 并在 .gitlab-ci 中获取 docker 操作,而不是像这里的 angular 内容:

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 的 "internal" 注册表,如果您想使用自己的注册表,请相应地更改值:

#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 中并通过环境变量引用,这样它们就不会保存在存储库中。

最后,如果您决定保护这些值,您的脚本可能如下所示。参考 Gitlab 的 official docs on how to add secret CI variables - super easy task。

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