ошибка gitlab ci / bin / sh: оценка: строка 138: докер: не найден

# #docker #gitlab-ci

Вопрос:

бегун gitlab выдает ошибку, когда я пытаюсь создать образ docker

gitlab-ci.yml

 container_scanning:
  stage: test
  image:
    name: $CI_REGISTRY/devops/trivy/trivy:0.20.1

  variables:
    GIT_STRATEGY: none
    FULL_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
    # Tell docker CLI how to talk to Docker daemon.
    DOCKER_HOST: tcp://localhost:2375/
    # Use the overlayfs driver for improved performance.
    DOCKER_DRIVER: overlay2
    # Disable TLS since we're running inside local network.
    DOCKER_TLS_CERTDIR: ""
  script:
    - docker build -t testdocker .
 

Dockerfile

 FROM 
Test.dev/devops/aquasec/trivy:0.16.0
RUN trivy filesystem --skip-update --exit-code 1 --no-progress /
 

ошибка

 /bin/sh: eval: line 138: docker: not found
$ docker build -t testdocker .
 

Я проверил историю изображений docker, точка входа ENTRYPOINT ["trivy"] :

 ~$ docker image history --no-trunc aquasec/trivy:latest
IMAGE                                                                     CREATED       CREATED BY                                                                                          SIZE      COMMENT
sha256:9a0e347a8cda3c2bdf3f4d7aa24ccfb3e5dce8763bf6064526fdecd06aafd711   4 days ago    ENTRYPOINT ["trivy"]                                                                                0B        buildkit.dockerfile.v0
<missing>                                                                 4 days ago    COPY contrib/*.tpl contrib/ # buildkit                                                              14.7kB    buildkit.dockerfile.v0
<missing>                                                                 4 days ago    COPY trivy /usr/local/bin/trivy # buildkit                                                          39.3MB    buildkit.dockerfile.v0
<missing>                                                                 4 days ago    RUN /bin/sh -c apk --no-cache add ca-certificates git # buildkit                                    13.5MB    buildkit.dockerfile.v0
<missing>                                                                 7 weeks ago   /bin/sh -c #(nop)  CMD ["/bin/sh"]                                                                  0B        
<missing>                                                                 7 weeks ago   /bin/sh -c #(nop) ADD file:aad4290d27580cc1a094ffaf98c3ca2fc5d699fe695dfb8e6e9fac20f1129450 in /    5.6MB  
 

Ответ №1:

Проблема в том, что вы говорите GitLab запустить конвейер в контейнере с изображением trivy image, которое, я полагаю, является пользовательским файлом Dockerfile, используемым aquasec/trivy в качестве базового образа.

Если вы не установили Docker CLI в свой пользовательский образ, нет никаких причин для его присутствия.

 ❯ docker pull aquasec/trivy
Using default tag: latest
latest: Pulling from aquasec/trivy
a0d0a0d46f8b: Already exists
330bb1eb9af6: Pull complete
de4b3e2cc536: Pull complete
65a5529ac0a6: Pull complete
Digest: sha256:c5e2a98e1c1a34f2f6d80f02b4f78fb25ddafbadb8f2b3962059b14c8da1d6f8
Status: Downloaded newer image for aquasec/trivy:latest
docker.io/aquasec/trivy:latest
❯ docker run --rm -it --entrypoint sh aquasec/trivy
/ # docker --version
sh: docker: not found
 

Если я отсканирую это изображение с docker scan помощью, я увижу, что оно используется alpine:3.14.2 как базовое изображение и apk как менеджер пакетов; итак, чтобы использовать Docker в этом контейнере, на вашем пользовательском изображении (том, что ниже $CI_REGISTRY/devops/trivy/trivy:0.20.1 ) должен быть установлен Docker CLI.

Dockerfile

 FROM aquasec/trivy

RUN apk add docker-cli
 

И, конечно, определили в конфигурации Docker Runners, в соответствии configuration.toml с которой используемые изображения выполняют привязку-монтирование /var/run/docker.sock .

Другой вариант — использовать Docker-in-Docker (непосредственно установить весь Docker в контейнере и запустить на нем демон).

Чтобы использовать Docker в Docker, вам придется немного изменить свою работу:

 container_scanning:
  stage: test
  image:
    name: $CI_REGISTRY/devops/trivy/trivy:0.20.1

  services:
    - docker:19.03.12-dind

  variables:
    GIT_STRATEGY: none
    FULL_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
    # Tell docker CLI how to talk to Docker daemon.
    DOCKER_HOST: tcp://localhost:2375/
    # Use the overlayfs driver for improved performance.
    DOCKER_DRIVER: overlay2
    # Disable TLS since we're running inside local network.
    DOCKER_TLS_CERTDIR: ""

  script:
    - docker build -t testdocker .
 

Имейте в виду, что в случае, если вы решите использовать Docker в Docker вместо фактического монтирования сокета, у вас будут следующие ограничения: https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#limitations-of-docker-in-docker

Комментарии:

1. Встроен ли dnid Docker-in-Docker в gitlab? Просто вставьте службы: — dnid ?

2. Я не уверен, где находится этот файл configuration.toml поэтому я не могу проверить содержимое, я должен быть администратором gitlab?

3. Это configuration.toml не в GitLab, а конфигурация самого бегуна. Обычно это находится под ~/.gitlab-runner/configuration.toml или /etc/gitlab-runner/configuration.toml , в зависимости от того, какого пользователя вы используете для выполнения Runner. dind Что касается использования сервиса dind , вам все равно нужно установить Docker CLI. Когда он увидит, что у вас нет сокета unix по умолчанию, он попытается найти его tcp://docker:2375 . Я добавлю опцию Docker-in-Docker к своему ответу.

4. теперь ошибка составляет около $ docker build -t testdocker . невозможно подготовить контекст: невозможно оценить символические ссылки в пути к файлу Dockerfile: lstat /builds / test/eval-grype/ Dockerfile: такого файла или каталога нет

5. содержимое моего файла Dockerfile «»ИЗ $ CI_REGISTRY / devops / trivy / trivy: 0.20.1 ЗАПУСТИТЕ apk add docker-cli»» поскольку нет подключения к Интернету снаружи, мне нужно использовать реестр из репозитория nexus