【问题标题】:How to have docker and npm in gitlab-ci-runner-docker如何在 gitlab-ci-runner-docker 中拥有 docker 和 npm
【发布时间】:2021-02-11 21:40:00
【问题描述】:

我正在使用带有docker:dind 的 gitlab-ci 作为服务。

问题

我正在尝试在 Gitlab-CI 中运行 npm run build,然后运行 ​​docker build

我可以通过这种方式在 docker 中使用 docker 进行构建:

这是我的跑步者config.toml:

$ cat /etc/gitlab-runner/config.toml 
concurrent = 4
check_interval = 0

[[runners]]
  name = "developers_gitlab_school-gitlab-runner-docker"
  url = "https://school.domain.com"
  token = "cd09f40c6a4....a44751fec795e35"
  executor = "docker"
  builds_dir = "/mnt/mesos/sandbox/builds"
  cache_dir = "/mnt/mesos/sandbox/cache"
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = true
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
  [runners.cache]

这是.gitlab-ci.yml的示例

image: docker:latest
# image: mcasimir/dind-node-build-runner:latest

variables:
  DOCKER_DRIVER: overlay2

services:
  - docker:dind

before_script:
  - docker info
  - docker --version
  - docker login -u ${REGISTRY_USERNAME} -p ${REGISTRY_PASSWORD} ${REGISTRY_URL}

stages:
  - build

# Job: Build
build_dev:
  stage: build
  script:
    - docker build -t group/mail-server/dev:${CI_JOB_ID} .
  only:
    - dev
  tags:
    - docker

build_master:
  stage: build
  script:
    - docker build -t domain/mail-server:${CI_JOB_ID} .
    - docker build -t domain/mail-server:latest .
  only:
    - master
  tags:
    - docker
  1. 当我使用带有 docker 和 npm 的图像进行构建时 mcasimir/dind-node-build-runner:latest 我有:

    Cannot connect to the Docker daemon. Is the docker daemon running on this host?. 
    
  2. 当我使用图像 docker:latest 时,docker-in-docker 工作正常,但我仍然需要 npm。

问题:

因为docker:latest 的Dockerfile 不是公开的,而且我无法使用这张图片中的apt-get,所以我想知道:

  • 如果有办法让图像可以在 gitlab-ci 中运行 dockernpm

【问题讨论】:

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


    【解决方案1】:

    因为它是基于 alpine 的图像,所以你没有 apt-get,你有 apk。所以使用默认的docker:latest 只需添加这个apk --update add nodejs

    before_script:
        - apk --update add nodejs npm
    

    你已经准备好使用dind、nodejs和npm了。

    【讨论】:

    • 我可以知道这样做与仅使用 this official alpine node Dockerfile 的内容扩展 docker:latest 之间的区别吗?
    • 那个 alpine-node 在 docker install 中没有 docker。那是常规的节点基础映像。有意义吗?
    • 我使用FROM docker:latest 创建了自己的 Docker 映像,并附加了该文件的内容。我认为确实如此,但也许我错了。
    • 你的意思是this?请记住,apk 相当于 apt get
    • 我还必须安装 npm,也许示例应该更新为 - apk --update add nodejs npm
    【解决方案2】:

    如果我们查看 docker 容器的 source code,我们可以看到正在设置一个变量:$DOCKER_HOST,这就是您所需要的,只需添加export DOCKER_HOST='tcp://docker:2375' 作为构建中的一个步骤或将 DOCKER_HOST 设置为一个全局变量。然后你可以使用任何你想要的图片,而不仅仅是docker:latest

    dockeralpine:
      image: alpine
      services:
       - docker:dind
      variables:
        DOCKER_HOST: "tcp://docker:2375"
      tags: 
       - docker
      script:
       - apk --update add docker
       - docker ps
    
    dockerubuntu:
      image: ubuntu
      services:
       - docker:dind
      variables:
        DOCKER_HOST: "tcp://docker:2375"
      tags: 
       - docker
      script:
       - apt update
       - apt install -yqq docker.io
       - docker ps
    

    【讨论】:

    • 我正在使用 gitlab-ci 和 .gitlab-ci.yml 为我做这件事。 (我假设)
    • @BigDong 除非你告诉它,否则它不会。如果你想运行一个不是基于 docker 镜像的镜像,你必须添加它。
    • 那我如何确定主机名呢?我想我不能只写docker 作为 ip 我是正确的吗?
    • @BigDong 是的。我可能应该举一个完整的例子。
    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2021-12-03
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多