首页 文章

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

提问于
浏览
0

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

gitlab-ci.yml using 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

现在,我想切换到泊坞窗图像 . 我已经重新配置了跑步者使用docker图像,我在下面看到的新gitlab-ci.yml文件中指定了图像 . 我按照gitlab-ci docker教程,这是它停止的地方所以我不完全确定从哪里开始:

gitlab-ci.yml using 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

Questions:

  • 使用我当前的gitlab-ci.yml文件,如何构建一个docker镜像/甚至构建一个?如果有,那意味着什么?目前管道通过,但我不知道它是否在docker镜像中(我本来应该告诉?) .

另外,假设已创建docker镜像,运行测试,并且管道已通过;它应该将代码推送到新的存储库(尚未包含在yml文件中) . 从我收集到的,图像没有被推动,它只是代码,对吧?那么这个创建的docker镜像怎么办?

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

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

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

1 回答

  • 1

    如果要将应用程序完全停靠,则必须采用不同的方法来构建应用程序 . 将有角度的东西导出到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代表构建您的角度应用:

    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
    

    现在有了你的应用程序,它可以通过Web服务器提供 - 它's your choice and a different configuration that follows with each choice - cant even scratch a surface here. That'在 Dockerfile 实现 - 我们通常在我们公司使用Nginx .

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

    如果你想部署你的图像并在某个地方运行它 - 选择一个提供者 - AWS,Heroku,自己的基础设施 - 按照自己的方式使用它,但这远远不能覆盖所有那些一个答案,所以我会把它留给另一个当您指定要部署新构建的图像的位置时,以及您希望如何提供它的问题 . 在我们公司,我们与Rancher协调一致,但市场上有多种令人敬畏的竞争选择 .


    Edit 用于自定义注册表

    以上 .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 中,并通过env变量引用,以便它们不会保存在存储库中 .

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

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

相关问题