Support named pipes for Windows Docker executor
Summary
Named pipes cannot be specified as volumes in config.toml
, when using the docker-windows executor on Windows.
Steps to reproduce
- Install GitLab runner on Windows and use the windows-docker runner in combination with Windows Containers.
- Set the following volume mounts in
config.toml
:volumes = ["c:\\cache", "\\\\.\\pipe\\docker_engine:\\\\.\\pipe\\docker_engine"]
- Run a build on the runner.
.gitlab-ci.yml
is not relevant for this issue.
Actual behavior
The runner fails to spawn the Docker container and errors out.
Expected behavior
The build runs as normal and \\.\pipe\docker_engine
exists and is usable inside the container.
Relevant logs and/or screenshots
parsed config.toml output from --debug flag
Configuration loaded builds=0
listenaddress: ""
sessionserver:
listenaddress: ""
advertiseaddress: ""
sessiontimeout: 1800
concurrent: 1
checkinterval: 0
loglevel: null
logformat: null
user: ""
runners:
- name: name
limit: 0
outputlimit: 0
requestconcurrency: 0
runnercredentials:
url: https://url/
token: token
tlscafile: ""
tlscertfile: ""
tlskeyfile: ""
runnersettings:
executor: docker-windows
buildsdir: c:\builds
cachedir: ""
cloneurl: ""
environment: []
preclonescript: ""
prebuildscript: ""
postbuildscript: ""
debugtracedisabled: false
shell: ""
custombuilddir:
enabled: false
ssh: null
docker:
dockercredentials:
host: ""
certpath: ""
tlsverify: false
hostname: ""
image: mcr.microsoft.com/windows/servercore:ltsc2019
runtime: ""
memory: ""
memoryswap: ""
memoryreservation: ""
cpusetcpus: ""
cpus: ""
dns: []
dnssearch: []
privileged: false
disableentrypointoverwrite: false
usernsmode: ""
capadd: []
capdrop: []
oomkilldisable: false
securityopt: []
devices: []
disablecache: false
volumes:
- c:\cache
- \\.\pipe\docker_engine:\\.\pipe\docker_engine
volumedriver: ""
cachedir: ""
extrahosts: []
volumesfrom: []
networkmode: ""
links: []
services: []
waitforservicestimeout: 0
allowedimages: []
allowedservices: []
pullpolicy: ""
shmsize: 0
tmpfs: {}
servicestmpfs: {}
sysctls: {}
helperimage: ""
parallels: null
virtualbox: null
cache:
type: ""
path: ""
shared: false
s3:
serveraddress: ""
accesskey: ""
secretkey: ""
bucketname: ""
bucketlocation: ""
insecure: false
gcs:
cachegcscredentials:
accessid: ""
privatekey: ""
credentialsfile: ""
bucketname: ""
machine: null
kubernetes: null
sentrydsn: null
modtime: 2019-05-29T17:32:48.6935282Z
loaded: true
builds=0
listen_address not defined, metrics & debug endpoints disabled builds=0
[session_server].listen_address not defined, session endpoints disabled builds=0
Starting worker builds=0 worker=0
Feeding runners to channel builds=0
job log
Creating user-defined volumes... job=6175 project=132 runner=5XQ5vjxC
Using container "766bbc3b152587d9579442eba79fd6e3910377ece413f0673dcce390603e6723" as cache "c:\\cache"... job=6175 project=132 runner=5XQ5vjxC
Using host-based "\\\\.\\pipe\\docker_engine" for "c:\\builds\\test\\dindw\\pipe\\docker_engine"... job=6175 project=132 runner=5XQ5vjxC
Creating build volume... job=6175 project=132 runner=5XQ5vjxC
Using container "1866bcdb394fe09a3a096553d0bd21d23845d729ec5e056401e5ed74fc578caa" as cache "c:\\builds"... job=6175 project=132 runner=5XQ5vjxC
Creating services... job=6175 project=132 runner=5XQ5vjxC
Starting Docker command... job=6175 project=132 runner=5XQ5vjxC
# Some parts stripped that are not relevant
Creating container runner-5XQ5vjxC-project-132-concurrent-0-predefined-0 ... job=6175 project=132 runner=5XQ5vjxC
ERROR: Job failed (system failure): Error response from daemon: invalid volume specification: '\\.\pipe\docker_engine:c:\builds\test\dindw\pipe\docker_engine': invalid mount config for type "npipe": 'c:\builds\test\dindw\pipe\docker_engine' is not a valid pipe path (executor_docker.go:726:0s) duration=279.0968ms job=6175 project=132 runner=5XQ5vjxC
Appending trace to coordinator... ok code=202 job=6175 job-log=0-1037 job-status=running runner=5XQ5vjxC sent-log=0-1036 status=202 Accepted
Submitting job to coordinator... ok code=200 job=6175 job-status= runner=5XQ5vjxC
ERROR: Failed to process runner builds=0 error=Error response from daemon: invalid volume specification: '\\.\pipe\docker_engine:c:\builds\test\dindw\pipe\docker_engine': invalid mount config for type "npipe": 'c:\builds\test\dindw\pipe\docker_engine' is not a valid pipe path (executor_docker.go:726:0s) executor=docker-windows runner=5XQ5vjxC
Feeding runners to channel builds=0
Checking for jobs... nothing runner=5XQ5vjxC
Environment description
Windows Server 2019 Datacenter edition (with containers) image from Azure. Using Windows Containers.
config.toml contents
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "name"
url = "https://url/"
token = "token"
executor = "docker-windows"
builds_dir = "c:\\builds"
[runners.custom_build_dir]
[runners.docker]
tls_verify = false
image = "mcr.microsoft.com/windows/servercore:ltsc2019"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["c:\\cache", "\\\\.\\pipe\\docker_engine:\\\\.\\pipe\\docker_engine"]
shm_size = 0
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
Used GitLab Runner version
11.11.0 and 11.11.1 have issues with all volume mounts (not only named pipes), so I used this build instead: https://gitlab-runner-downloads.s3.amazonaws.com/make-volumes-to-work-on-linux-docker-on-windows/index.html
.\gitlab-runner.exe --version
Version: 11.12.0~beta.1532.g22b4c488
Git revision: 22b4c488
Git branch: make-volumes-to-work-on-linux-docker-on-windows
GO version: go1.8.7
Built: 2019-05-29T10:31:00+0000
OS/Arch: windows/amd64
Proof that this works without GitLab Runner
docker run --rm -it --isolation=hyperv -v \\.\pipe\docker_engine:\\.\pipe\docker_engine mcr.microsoft.com/windows/servercore:1809
References
Possible fixes
Runner should not rewrite the path but keep it intact as specified.