如何在 gitlab-ci-runner-docker 中使用 docker 和 npm

How to have docker and npm in gitlab-ci-runner-docker

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

问题

我正在 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 不是 public,并且因为我无法从这个镜像中使用 apt-get,所以我想知道:

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

before_script:
    - apk --update add nodejs npm

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

如果我们查看 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