“ volume”参数在docker中如何工作?

时间:2019-02-19 15:05:52

标签: docker gitlab mount

我的.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 :(得分:1)

我确定您正在使用docker-in-docker模式。

在此模式下,管道中的docker命令有效地连接到 HOST 计算机的docker守护程序,并将所有命令发送到那里。结果,主机尝试将/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 writes

  

将源仓库中的文件和目录共享到容器中   由于批量安装是在以下情况下完成的,因此无法正常工作   主机,而不是构建容器