# #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