gitlab-ci.yml:如何使用Dind创建docker镜像

时间:2020-08-06 14:52:37

标签: docker gitlab gitlab-ci

我的GitLab-ci.yml中具有以下逻辑:

stages:
  - build
  - deploy

variables:
    IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG

make_patch:
  image: node:10.19
  stage: build
  script:
    - npm install
    - make
    - make source-package
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
    - node_modules/
  artifacts:
    when:
    paths:
      - test.tar.bz2
    expire_in: 2 days

  test_feature:
    stage: deploy
    image: dockerhub_image:123
    script:
      - apt-get install bzip2
      - apt-get install curl -y
      - ls -lah
      - curl -kL https://mygitlabserver/namespace/project/-/jobs/artifacts/master/download?job=make_patch
      - tar -xvjf test.tar.bz2
      - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
      - docker build --no-cache -t $IMAGE_TAG .
      - docker push $IMAGE_TAG

因此,我试图通过构建一个nodejs图像来测试仓库中的更改;如果可以编译,那么我将保存一个zip文件,其中包含在潜在生产系统中需要使用的所有Web文件。 然后,我从公共docker hub下载一个现有映像(因为这实际上是我们正在修改的开源应用程序)。我想在那里更新Web文件夹,然后尝试从中创建一个Docker容器并将其保存到我的项目存储库中。 从下面的输出中可以看到,它当前正在失败,因为正如@marvin指出的那样,dockerhub_image:123 in没有docker cli。

523$ docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
524/bin/bash: line 107: docker: command not found
525[cmd] sh exited 1
526[cont-finish.d] executing container finish scripts...
527[cont-finish.d] done.
528[s6-finish] waiting for services.
529[s6-finish] sending all processes the TERM signal.
530[s6-finish] sending all processes the KILL signal and exiting.
532ERROR: Job failed: exit code 1

我在项目中定义了一个Deploy令牌,如下所示:

Name: webtoken
Username: webtoken-1
Created: Aug 6, 2020
Expires: Never
Scopes
read_repository, read_registry, write_registry, read_package_registry, write_package_registry

我发现了这篇文章:Gitlab CI - docker: command not found

但是我很难理解在我的情况下我该在哪里包含对docker映像的引用。还是可以在此“ test_feature”作业中添加服务条款?

services:
  - docker:dind

抱歉,有补救问题。我只是docker和GitLab的新手。 我尝试像这样更改test_feature作业,但是它仍然失败,并显示相同的错误:

  test_feature:
    stage: deploy
    image: dockerhub_image:123
    services:
      - docker:dind
    script:
      - apt-get install bzip2
      - apt-get install curl -y
      - ls -lah
      - curl -kL https://mygitlabserver/namespace/project/-/jobs/artifacts/master/download?job=make_patch
      - tar -xvjf test.tar.bz2
      - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
      - docker build --no-cache -t $IMAGE_TAG .
      - docker push $IMAGE_TAG

2 个答案:

答案 0 :(得分:3)

详细介绍@Alessandro Chitolina的答案:

首先,如果您想在GitLab CI中使用docker-in-docker方法查看Docker构建的整个工作示例,可以使用here

第二,如果我不知道如何在GitLab CI中做某事,我发现检查Auto DevOps模板很有用。 here提供了一个使用docker-in-docker进行Docker构建的工具。您甚至可以按照here中的说明将其直接导入到管道中。

最后,也可以使用kaniko,而不是here所述,而不是docker-in-docker方法。

作为旁注-无需在make_patch作业中从test_feature下载工件-它会自动下载-有关详细信息,请参见here

答案 1 :(得分:1)

您没有以执行程序身份运行docker映像。

这是从构建docker映像的工作中获取的:

build:
    image: docker:latest
    stage: build
    services:
        - docker:dind
    variables:
        DOCKER_HOST: tcp://docker:2375
        DOCKER_TLS_CERTDIR: ''
    script:
        - docker build -t xxx .
相关问题