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

将docker与gitlab ci集成-如何构建和使用docker映像?,docker,gitlab,gitlab-ci,gitlab-ci-runner,Docker,Gitlab,Gitlab Ci,Gitlab Ci Runner,我以前使用gitlab runner的shell来构建我的项目。到目前为止,我已经设置了管道,可以运行我在gitlab-ci.yml文件中设置的任何命令,如下所示: gitlab-ci.yml使用shell runner before_script: - npm install - npm install --save @angular/material @angular/cdk cache: paths: - node_modules/ stages: - dev

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

gitlab-ci.yml使用shell runner

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
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
现在,我想切换到docker图像。我已将runner重新配置为使用docker映像,并在新的gitlab-ci.yml文件中指定了该映像,如下所示。我遵循了gitlab ci docker教程,这是它结束的地方,因此我不完全确定从这里可以走到哪里:

gitlab-ci.yml使用docker runner

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
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
问题:

  • 在我当前的gitlab-ci.yml文件中,这是如何构建docker映像的?如果是,那是什么意思?目前管道通过了,但我不知道它是否在docker图像中通过了(我应该能够告诉吗?)

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

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

  • 是否需要在
    docker run
    docker exec
    中包围gitlab-ci.yml文件中的所有命令?如果不包含这两个命令中的任何一个,它似乎只是在服务器上运行,而不是在docker映像中运行

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


  • 如果你想完全实现应用程序的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
    
    现在,随着你的应用程序的构建,它可以通过网络服务器提供服务-这是你的选择,每个选择都有不同的配置-甚至不能在这里触及表面。这将在
    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\u JOB\u TOKEN
      到您的密码
    • $CI_REGISTRY
      到您的注册表地址
    这些值应该存储在Gitlab的
    CI secret variables
    中,并通过env变量引用,以便它们不会保存在存储库中

    最后,如果您决定保护这些值,您的脚本可能如下所示。请参阅Gitlab的-超级简单任务

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

    经过多次尝试和阅读另一个教程后,我遇到了运行此命令的问题:
    -docker login-u gitlab ci token-p$ci\u JOB\u token$ci\u REGISTRY
    。它建议我使用
    --password stdin
    ,但使用它的唯一方法是从这样的文件中输入密码:
    cat~/my_password.txt | docker login--username foo--password stdin
    。有没有办法通过gitlab的“秘密变量”部分使用加密密码?只是为了澄清-您没有使用gitlab的注册表?在我提出这个问题后,我设置了自己的本地注册表。因此,当我运行这个命令时,它会说:
    $docker login-u gitlab ci token--password stdin$ci\u JOB\u token$ci\u registry“docker login”最多需要1个参数。
    上述方法仅适用于gitlab的注册表,如果您想使用自己的注册表,请相应地将值从
    gitlab ci token更改为您在注册表中的登录名,
    $CI_JOB_TOKEN
    到您的密码和
    $CI_REGISTRY
    到您的注册表公共地址-它们应该存储在gitlab的机密中,并通过env变量引用,这样它们就不会保存在存储库中。如果不清楚,我可以用它更新。