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 <details> <summary> parsed config.toml output from --debug flag</summary> ```sh 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 ``` </details> <details> <summary> job log </summary> ```sh 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 ``` </details> ## Environment description Windows Server 2019 Datacenter edition (with containers) image from Azure. Using Windows Containers. <details> <summary> config.toml contents </summary> ```toml 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] ``` </details> ### 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 https://gitlab.com/gitlab-org/gitlab-runner/merge_requests/1363#note_175944817 https://gitlab.com/gitlab-org/gitlab-runner/issues/4264#note_174327892 ## Possible fixes Runner should not rewrite the path but keep it intact as specified.
issue