“音量”参数如何在docker中起作用?

问题描述 投票:1回答:1

我的.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)的内容。我的音量似乎没有成功安装,但我没有错误。

docker gitlab mount
1个回答
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

将源repo中的文件和目录共享到容器中可能无法按预期工作,因为卷安装是在主机的上下文中完成的,而不是在构建容器中完成的

© www.soinside.com 2019 - 2024. All rights reserved.