Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"not a directory" when using dot in volume path #675

Closed
2 of 3 tasks
marverix opened this issue May 21, 2019 · 17 comments
Closed
2 of 3 tasks

"not a directory" when using dot in volume path #675

marverix opened this issue May 21, 2019 · 17 comments

Comments

@marverix
Copy link

  • This is a bug report
  • This is a feature request
  • I searched existing issues before opening this one

Expected behavior

Mount volume

Actual behavior

Getting error:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:424: container init caused \"rootfs_linux.go:58: mounting \\\"/home/xxx/yyy/zzz/somefilenamewith.dot\\\" to rootfs \\\"/var/lib/docker/overlay2/fd10f39daa93c99d3b30cf0beef233f70be5ba5c820784f95b4bfc3c669c8202/merged\\\" at \\\"/var/lib/docker/overlay2/fd10f39daa93c99d3b30cf0beef233f70be5ba5c820784f95b4bfc3c669c8202/merged/somefilenamewith.dot\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

Steps to reproduce the behavior

  1. Go to /home/xxx
  2. Run command:
docker run --rm \
    -p 9080:8090 \
    -v "$(pwd)/yyy/zzz\somefilenamewith.dot:/somefilenamewith.dot" \
    mylocalimage \
    java -jar somejar.jar

Output of docker version:

Client:
 Version:           18.09.6
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        481bc77
 Built:             Sat May  4 02:35:57 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.6
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       481bc77
  Built:            Sat May  4 01:59:36 2019
  OS/Arch:          linux/amd64
  Experimental:     false

Output of docker info:

Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 19
Server Version: 18.09.6
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.18.0-20-generic
Operating System: Ubuntu 18.04.2 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 15.55GiB
Name: achtung
ID: 2OUG:VVP3:QPXT:3GB4:MCYB:SDFK:WQNC:YLGC:7TGM:5JVF:3Q5Z:VPBR
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine

WARNING: No swap limit support

Additional environment details (AWS, VirtualBox, physical, etc.)

@cpuguy83
Copy link
Collaborator

This error occurs when you are trying to mount a directory to a file.
This can happen if $(pwd)/yyy/zzz\somefilenamewith.dot does not exist.

You might consider using --mount type=bind,source=$(pwd)/yyy/zzz\somefilenamewith.dot,target=/somefilenamewith.dot.
With the -v syntax, docker will create the source path (as a directory) if it doesn't exist.

@Nolanus
Copy link

Nolanus commented Jun 24, 2020

Any update on this? Still same problem with server version 19.03.5. I have to mount a file into a docker machine path containing a dot, /root/.server/settings, but the traditional -v syntax as well as the --mount syntax fails with not a directory error:

docker run -v /opt/docker/settings.yaml:/root/.server/settings.yaml {docker_image_name_here}

docker run --mount type=bind,source=/opt/docker/settings.yaml,target=/root/.server/settings.yaml {docker_image_name_here}

Error

docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/opt/docker/settings.yaml\\\" to rootfs \\\"/mnt/sda1/var/lib/docker/overlay2/27a5a3e983d6719b6d6d72c5ff88c4475ecfca67f6fe8cc0f8e383aa1ec4dfdc/merged\\\" at \\\"/mnt/sda1/var/lib/docker/overlay2/27a5a3e983d6719b6d6d72c5ff88c4475ecfca67f6fe8cc0f8e383aa1ec4dfdc/merged/root/.server/settings.yaml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

@cpuguy83
Copy link
Collaborator

As mentioned above, the error is due to mismatched file types... one side is a dir the other side is a file.
We can't mount a dir onto a file, or vice-versa.

Is /opt/docker/settings.yaml even accessible to the docker daemon?
The --mount would fail if /opt/docker/settings.yaml doesn't exist, but -v will create a directory there if it doesn't exist.... so if you run -v first, you'll get a directory.

Closing since this does not look like an issue.

@fplk
Copy link

fplk commented Mar 22, 2021

@cpuguy83 Are you sure this issue does not exist? I have noticed similar behavior for X server passthroughs: For months I have been using -v /tmp/.docker.xauth:/tmp/.docker.xauth where /tmp/.docker.xauth was created via

touch /tmp/.docker.xauth
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge -

and is thus a file. Just to verify:

$ ls -aF /tmp/ | grep docker
.docker.xauth

(entry would have a trailing slash if it was a directory due to -F parameter - it is a file).

But when I try to mount it now I hit a very similar issue:

$ docker run -it -e PYTHONIOENCODING=utf8 -e XAUTHORITY=/tmp/.docker.xauth -e DISPLAY=:1            -v /tmp/.X11-unix:/tmp/.X11-unix            -v "/tmp/.docker.xauth:/tmp/.docker.xauth"            --net host --gpus all --rm myimage nvidia-smi
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: process_linux.go:495: container init caused: rootfs_linux.go:60: mounting "/tmp/.docker.xauth" to rootfs at "/var/lib/docker/overlay2/156e596b0480514b410b11627e44ce2d3d7fe74e62bb7c37146de17fc934f135/merged/tmp/.docker.xauth" caused: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

When I copy the file to /tmp/dockerauth and mount that, it works, but if I take that new file and mount it to /tmp/.docker.xauth, the same issue occurs again:

$ docker run -it -e PYTHONIOENCODING=utf8 -e XAUTHORITY=/tmp/.docker.xauth -e DISPLAY=:1            -v /tmp/.X11-unix:/tmp/.X11-unix            -v "/tmp/dockerauth:/tmp/.docker.xauth"            --net host --gpus all --rm myimage nvidia-smi
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: process_linux.go:495: container init caused: rootfs_linux.go:60: mounting "/tmp/dockerauth" to rootfs at "/var/lib/docker/overlay2/dde620daea76a89cdeed0f56a2fa45b55ad98aa9da6370564a7828a345df8dd6/merged/tmp/.docker.xauth" caused: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

So while I don't have time to investigate this more profoundly, my impression is that @Nolanus is indeed onto something and that it might be worth it to investigate the issue further.

It seems the host file path can contain dots:

docker run -it -e PYTHONIOENCODING=utf8 -e XAUTHORITY=/tmp/dockerxauth -e DISPLAY=:1            -v /tmp/.X11-unix:/tmp/.X11-unix            -v "/tmp/.docker.xauth:/tmp/dockerxauth"            --net host --gpus all --rm myimage nvidia-smi

works. Also note that -v /tmp/.X11-unix:/tmp/.X11-unix does not cause any issues - most likely because unlike /tmp/.docker.xauth it is a directory and not a file.

I'm on Ubuntu 20.04 and my Docker version is:

Client: Docker Engine - Community
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        55c4c88
 Built:             Tue Mar  2 20:18:20 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8
  Built:            Tue Mar  2 20:16:15 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

@nathan-chappell
Copy link

I'm also getting strange behavior on windows using docker. Basically, the tree looks like:

D:\project\foo1.txt
D:\project\foo2.dir\here
D:\project\foo2.dir\is
D:\project\foo2.dir\missing
D:\project\foo2.dir\stuff

When I do -vD:\project:/bar then in the guest I see:

/bar/foo1.txt
/bar/foo2.dir/       #empty!

@mgeis
Copy link

mgeis commented Jan 26, 2022

confirmed on Docker Desktop for MacOS 4.3.0. Was using a sample docker compose file from a downloaded GitHub project that had a directory with dots in the name, and mounted it into a similarly named location. Changed the '.' chars to '_' and the problem went away. Docker reported an error with part of the desired mount not being a directory (even though the source most certainly was).

@GustavR
Copy link

GustavR commented Feb 10, 2022

I was finally able to narrow it down.
Using Docker Desktop (4.4.4 (73704)) with WSL2.

If the filename contains exactly three characters after the last dot it is considered a file. If it contains no dot the auto detection still seems to work fine. If it contains any other amount of characters after the last dot, it seems to be considered a directory.

volumes:
  - ./docker/app/vhost.conf:/etc/apache2/sites-enabled/000-default.conf # error: Cannot create container for service app: not a directory
  - ./docker/app/vhost.cnf:/etc/apache2/sites-enabled/000-default.conf # works
  - ./docker/app/vhost_conf:/etc/apache2/sites-enabled/000-default.conf # works

This is extremely annoying and has worked before (not exactly sure since which version it stopped working), but rather recently, like beginning of January.

@cronhan
Copy link

cronhan commented Feb 15, 2022

I have also found now that if I try to specify the following:
--volume /home/hostuser/.bash_history_docker:/home/dockeruser/.bash_history:rw
I also get the "not a directory error". The fix was to rename the .bash_history_docker file to .bash_historydocker, i.e. there should not be more than one underscore in the file name.

@ospira
Copy link

ospira commented Feb 26, 2022

I was finally able to narrow it down. Using Docker Desktop (4.4.4 (73704)) with WSL2.

If the filename contains exactly three characters after the last dot it is considered a file. If it contains no dot the auto detection still seems to work fine. If it contains any other amount of characters after the last dot, it seems to be considered a directory.

volumes:
  - ./docker/app/vhost.conf:/etc/apache2/sites-enabled/000-default.conf # error: Cannot create container for service app: not a directory
  - ./docker/app/vhost.cnf:/etc/apache2/sites-enabled/000-default.conf # works
  - ./docker/app/vhost_conf:/etc/apache2/sites-enabled/000-default.conf # works

This is extremely annoying and has worked before (not exactly sure since which version it stopped working), but rather recently, like beginning of January.

thank you so much this saved my day!!!! confirmed it was working as late as early February for me and just recently broke.

mryachanin added a commit to mryachanin/cookbook that referenced this issue Mar 26, 2022
@spangaer
Copy link

Using Docker Desktop ( 4.7.1 (77678) ) with WSL2.

Problem persists...

@nollium
Copy link

nollium commented May 21, 2022

Problem happening with Docker Desktop and WSL2 + Docker Compose with a .env file

version: '3.5'

services:
  api:
    container_name: ft_api
    build: .
    networks:
    - default
    - ft_transcendance
    ports:
    - 0.0.0.0:3000:3000
    environment:
# Default common values
# Config file containing credentials values
      CONFIG_FILE: /opt/.env
      CONFIG_JSON: /app/config.json
    volumes:
# Add env config file
    - ./.env:/opt/.env
# Mount code to avoid rebuild container to refresh code
    - ./src:/app/src
    - ./config.json:/app/config.json
    healthcheck:
      disable: false
    restart: unless-stopped

Docker version 20.10.5+dfsg1, build 55c4c88

@aleskozina
Copy link

aleskozina commented Aug 18, 2022

Problem still happening; Docker: Docker version 20.10.17, build 100c701

Error

"invalid mount config for type "bind": bind source path does not exist: /home/deployer/.actions-runner/_work/rms-backend/rms-backend/storage" 
$ pwd
/home/deployer/.actions-runner/_work/rms-backend/rms-backend
$ ls -la
total 372
drwxr-xr-x 13 deployer deployer   4096 Aug 18 12:18 .
drwxr-xr-x  3 deployer deployer     25 Aug 17 16:24 ..
drwxr-xr-x  5 deployer deployer     80 Aug 18 12:17 app
-rw-r--r--  1 deployer deployer   1686 Aug 18 12:17 artisan
drwxr-xr-x  3 deployer deployer     34 Aug 18 12:17 bootstrap
-rw-r--r--  1 deployer deployer   2063 Aug 18 12:17 composer.json
-rw-r--r--  1 deployer deployer 326158 Aug 18 12:17 composer.lock
drwxr-xr-x  3 deployer deployer   4096 Aug 18 12:17 config
drwxr-xr-x  5 deployer deployer     74 Aug 18 12:17 database
drwxr-xr-x  2 deployer deployer    201 Aug 18 12:17 .docker
-rw-r--r--  1 deployer deployer    258 Aug 18 12:17 .editorconfig
-rw-r--r--  1 deployer deployer   1060 Aug 18 12:17 .env.example
-rw-r--r--  1 deployer deployer    152 Aug 18 12:17 .gitattributes
-rw-r--r--  1 deployer deployer    238 Aug 18 12:17 .gitignore
drwxr-xr-x  4 deployer deployer     56 Aug 18 12:17 lang
-rw-r--r--  1 deployer deployer    473 Aug 18 12:17 package.json
-rw-r--r--  1 deployer deployer   1249 Aug 18 12:17 phpunit.xml
drwxr-xr-x  2 deployer deployer     77 Aug 18 12:17 public
-rw-r--r--  1 deployer deployer     94 Aug 18 12:17 README.md
drwxr-xr-x  7 deployer deployer     67 Aug 18 12:17 resources
drwxr-xr-x  4 deployer deployer     92 Aug 18 12:17 routes
drwxr-xr-x  5 deployer deployer     46 Aug 18 12:17 storage
-rw-r--r--  1 deployer deployer    175 Aug 18 12:17 .styleci.yml
drwxr-xr-x  4 deployer deployer    112 Aug 18 12:17 tests
-rw-r--r--  1 deployer deployer    559 Aug 18 12:17 webpack.mix.js

Compose file

php-fpm:
  image: php:8.1-fpm-alpine
  ports:
    - 9000:9000
  volumes:
    - ./../storage:/rms/storage
  networks:
    - traefik-rms
  deploy:
    replicas: 3
    mode: replicated
    update_config:
      parallelism: 1
      delay: 10s
      failure_action: rollback
      monitor: 5s
    restart_policy:
      condition: any
      delay: 5s
      max_attempts: 5

I need to clarify that this runs on a self-hosted GitHub action runner under this path: /home/${USER}/.actions-runner/

@spangaer
Copy link

Update:
I reached out to Docker support on the subject back then and they figured out the bug which looks to be fixed in Docker Desktop 4.9.0
https://docs.docker.com/desktop/release-notes/#docker-desktop-490

For Windows, first bullet. I verified the fix with temp build at the time.

@allen-stubberud
Copy link

allen-stubberud commented Sep 13, 2022

This bug is not in Docker Desktop and it is not fixed as of 20.10.18.

docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/workspaces/hedons/deploy/vscode-nginx.conf" to rootfs at "/etc/nginx/nginx.conf": mount /workspaces/hedons/deploy/vscode-nginx.conf:/etc/nginx/nginx.conf (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

@TZECHIN6
Copy link

Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/tmp/.docker.xauth" to rootfs at "/tmp/.docker.xauth": mount /tmp/.docker.xauth:/tmp/.docker.xauth (via /proc/self/fd/7), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

Same issue here

Docker version

Client: Docker Engine - Community
 Version:           20.10.20
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        9fdeb9c
 Built:             Tue Oct 18 18:20:23 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.20
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.7
  Git commit:       03df974
  Built:            Tue Oct 18 18:18:12 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.8
  GitCommit:        9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

@doctor-beat
Copy link

I confirm this issue for 'Docker version 20.10.22, build 3a2c30b' on a macos

@baptx
Copy link

baptx commented May 5, 2024

The solution from @GustavR did not work for me. Another workaround could be to remove the line causing the error and use docker cp to copy the file manually in the container.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests