Tech Journal - Docker failed to mount drive
Created on: 29 Feb 24 10:53 +0700 by Son Nguyen Hoang in English
Docker failed to mount at start-up. Linux mint
Problem
I have a container (lissy93/dashy) and another one (jellyfin) that is running normally using docker-compose. The docker-compose file looks similar to this
// Welcome to Dashy! To get started, run `docker compose up -d`
// You can configure your container here, by modifying this file
version: "3.8"
services:
dashy:
container_name: Dashy
# Pull latest image from DockerHub
image: lissy93/dashy
# To build from source, replace 'image: lissy93/dashy' with 'build: .'
# build: .
# Or, to use a Dockerfile for your archtecture, uncomment the following
# context: .
# dockerfile: ./docker/Dockerfile-arm32v7
# You can also use an image with a different tag, or pull from a different registry, e.g:
# image: ghcr.io/lissy93/dashy or image: lissy93/dashy:arm64v8
# Pass in your config file below, by specifying the path on your host machine
volumes:
- /home/username/dashy/config.yml:/app/public/conf.yml
# Set port that web service will be served on. Keep container port as 80
ports:
- 2280:80
# Set any environmental variables
environment:
- NODE_ENV=production
# Specify your user ID and group ID. You can find this by running `id -u` and `id -g`
# - UID=1000
# - GID=1000
# Specify restart policy
restart: always
# Configure healthchecks
healthcheck:
test: ['CMD', 'node', '/app/services/healthcheck']
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
and this (jellyfin)
version: "3.9"
services:
jellyfin:
image: linuxserver/jellyfin:10.8.11
container_name: jellyfin
environment:
- PUID=1000
- PGID=1000
- TZ=UTC
volumes:
- jellyfin-config:/config
- torrent-downloads:/data
ports:
- 2284:8096
- 7359:7359/udp
- 8920:8920
restart: always
networks:
- media-stack-network
volumes:
torrent-downloads:
driver: local
driver_opts:
o: bind
type: none
device: /media/username/E/TorrentDownloads
jellyfin-config:
driver: local
driver_opts:
o: bind
type: none
device: ./jellyfin.config
qbittorrent-config:
driver: local
driver_opts:
o: bind
type: none
device: ./qbittorrent.config
networks:
media-stack-network:
name: media-stack-network
The container works extremely well after I manually run docker-compose up. However, when the machine restart, Docker engine failed to start my container. According to the log from sudo journalctl -n docker.service, the error is
(for dashy)
failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting \"/home/username/dashy/config.yml\" to rootfs at \"/app/public/conf.yml\": mount /home/username//dashy/config.yml:/app/public/conf.yml (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"
(for jellyfin)
ockerd[1397]: time="2024-02-18T14:55:05.354714568+07:00" level=error msg="failed to start container" container=eae3dd9446da55032f568dc0993efbeeb7c01b096206babce37b22f933e63d38 error="error while mounting volume '/var/lib/docker/volumes/media-stack_jellyfin-config/_data': failed to mount local volume: mount /home/username/media-stack/jellyfin.config:/var/lib/docker/volumes/media-stack_jellyfin-config/_data, flags: 0x1000: no such file or directory"
My first assumption is that the docker start before file/folder mounted successfully, so I edited the docker.service file to be like this
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
RequiresMountsFor= /media/username/E /home/username/
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
(...)
Then I run system daemon-reload and “systemctl reload docker.service to trigger the change. But it’s not working. Also, I assume that the Docker version I am running is too old, but when runnng docker info the output is contradictory to my assumption
Client: Docker Engine - Community
Version: 25.0.3
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.12.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.24.5
Path: /usr/libexec/docker/cli-plugins/docker-compose
Also, the check from docker-compose -v show that my version is 1.29
I attempted to use Portainer (from a different machine) to start the Dashy before loggin to the Linux OS. The request was failed with return code 400. The same with Jellyfin with Error code 500
Solution
Thanks for the help of my brilliant older brother, Linh Nguyen Vinh, he suggests that this is due to the fact that the home folder has not be mounted before I logging to the OS. Hence, he suggests two solutions:
- To mount the
home/username
folder before logging. - To move the whole docker files and mounted drive to
/opts/
folder.
I decided to go with the second method and it works.
Conclusion
Always deploy to opts
folder.