我的.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-in-docker
模式。
在这种模式下,管道中的docker
命令有效地连接到HOST机器的docker守护程序并在那里发送所有命令。结果,主机尝试将/builds/ben/project
路径绑定到容器中,但是没有这样的路径。再次,在绑定挂载行为之后,此文件夹将被创建为空并映射到容器中。
如果您使用的是非特权模式(映射/var/run/docker.sock
),请尝试切换到使用docker:dind
作为服务。在这种情况下,守护进程将从您的构建作业中获取上下文。否则,您必须手动将数据复制到卷中。
使用/var/run/docker.sock
时,实际上将未修改的docker命令传递给守护进程,后者在自己的上下文中执行它们。这意味着他使用的是他的文件系统,而不是你的(工作)。我设法绕过这个通过手动克隆源到新容器的命令,如
git clone ${CI_REPOSITORY_URL} --branch ${CI_COMMIT_REF_NAME} --single-branch /tmp/project
缺点是你需要在图像中安装git
。
这就是gitlab writes:
将源repo中的文件和目录共享到容器中可能无法按预期工作,因为卷安装是在主机的上下文中完成的,而不是在构建容器中完成的