Как работает аргумент «громкость» в докере? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть следующие строки в моем файле .gitlabci:

- echo "$PWD"
- ls -l "$PWD"
- docker run --volume "$PWD":/code debian:stable ls -l /code

И следующий вывод:

$ echo "$PWD" 
/builds/ben/project 

$ ls -l "$PWD" total 52
-rw-rw-rw-    1 root     root           946 Feb 19 14:53 ChangeLog
-rw-rw-rw-    1 root     root           294 Feb 19 14:53 INSTALL
-rw-rw-rw-    1 root     root          4341 Feb 19 14:53 Jenkinsfile
-rw-rw-rw-    1 root     root           353 Feb 19 14:53 README.md
-rw-rw-rw-    1 root     root           535 Feb 19 14:53 TODO 
drwxrwxrwx    4 root     root          4096 Feb 19 14:53 application
drwxrwxrwx    2 root     root          4096 Feb 19 14:53 library 
drwxrwxrwx    3 root     root          4096 Feb 19 14:53 public 
drwxrwxrwx    3 root     root          4096 Feb 19 14:53 tests 

$ docker run --volume "$PWD":/code debian:stable ls -l /code 
total 0

Ниже мой файл .gitlabci:

code_quality:
  image: docker:stable

  variables:
    DOCKER_DRIVER: overlay

  allow_failure: true

  services:
    - docker:dind

  script:
    - echo "$PWD"
    - ls -l "$PWD"
    - docker run --volume "$PWD":/code debian:stable ls -l /code

И, наконец, config.toml моего бегуна:

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "test"
  url = "http://docker.int.com:1040/"
  token = "*************"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "docker:stable"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"]
    extra_hosts = ["mygitlab.com:XXX.XXX.XXX.XXX"]
    shm_size = 0
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

Я не понимаю, почему последняя команда не отображает содержимое моего каталога $ PWD (/ builds / ben / project).Кажется, мой том не был успешно подключен, но я не получаю сообщение об ошибке.

1 Ответ

0 голосов
/ 19 февраля 2019

Я уверен, что вы используете режим docker-in-docker.

В этом режиме команда docker в конвейере эффективно подключается к HOST демону докера машины и отправляет туда все команды.В результате host пытается привязать путь /builds/ben/project в контейнер, но такого пути нет.Опять же, следуя поведению связывания, эта папка будет создана пустой и сопоставлена ​​с контейнерами.

Если вы используете непривилегированный режим (отображение /var/run/docker.sock), попробуйте переключиться на использование docker:dind в качестве службы.В этом случае демон получит контекст вашей работы по сборке.В противном случае вам придется вручную копировать данные в том.

UPD

При использовании /var/run/docker.sock вы фактически передаете команды docker без изменений демону, который выполняет их в своем собственном контексте .Это означает, что он использует свою файловую систему, а не вашу (работу).Мне удалось обойти это путем ручного клонирования источников в новый контейнер с помощью команды, подобной

git clone ${CI_REPOSITORY_URL} --branch ${CI_COMMIT_REF_NAME} --single-branch /tmp/project

Недостатком является то, что вам нужно установить git в ваши изображения.

Это то, что gitlab пишет :

Совместное использование файлов и каталогов из исходного репозитория в контейнерах может не работать должным образом, так как монтирование тома выполняется в контексте хост-машины, а не сборочный контейнер

...