This error occurs when Docker cannot initialize the specified logging driver for a container. Common causes include misconfigured driver options, unavailable logging backends (journald, syslog, cloud services), missing credentials, or network connectivity issues to remote logging endpoints.
When you start a container, Docker initializes a logging driver to capture and forward container logs. The logging driver is specified either in the container's run command, docker-compose.yml, or in the daemon's default configuration (/etc/docker/daemon.json). The "failed to initialize logging driver" error indicates that Docker attempted to set up the logging driver but encountered a problem that prevents it from functioning. This can happen for several reasons: - **Driver not available**: The specified logging driver (journald, syslog, gelf, fluentd, awslogs, gcplogs, splunk, etc.) is not supported on the current platform or Docker version - **Backend unavailable**: The logging backend service (syslog daemon, journald, Loki, Splunk HEC, CloudWatch) is not running or accessible - **Authentication failure**: Cloud-based logging drivers (awslogs, gcplogs, splunk) cannot authenticate with the remote service - **Configuration errors**: Invalid log-opts parameters, wrong URLs, or malformed credentials - **Network issues**: Cannot connect to remote logging endpoints due to firewall rules, DNS resolution, or network timeouts - **Database locked**: On Synology NAS systems, the logging database can become locked This is a critical error because the container will not start until the logging driver can be successfully initialized.
First, determine which logging driver is failing and the exact error message:
Check the full error message:
The error typically includes the driver name and a more specific reason:
failed to initialize logging driver: journald is not enabled on this host
failed to initialize logging driver: Unix syslog delivery error
failed to initialize logging driver: database is locked
failed to initialize logging driver: unable to connect or authenticate with Google Cloud Logging
failed to initialize logging driver: NoCredentialProviders: no valid providers in chainCheck your container's logging configuration:
# For a specific container
docker inspect <container_name> | grep -A 10 "LogConfig"
# Check daemon default logging driver
docker info | grep "Logging Driver"Check docker-compose.yml if using Compose:
Look for the logging section in your service configuration:
services:
myapp:
image: myapp:latest
logging:
driver: syslog # <-- This is the driver causing issues
options:
syslog-address: "tcp://localhost:514"The quickest way to get your container running is to use the default json-file driver:
Override at runtime:
docker run --log-driver=json-file myimageOverride in docker-compose.yml:
services:
myapp:
image: myapp:latest
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"Override in daemon.json:
Edit /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}Then restart Docker:
sudo systemctl restart dockerNote: This is a temporary workaround. Continue with the following steps to fix the actual driver issue.
The journald driver is only available on Linux systems with systemd.
Error:
failed to initialize logging driver: journald is not enabled on this hostCheck if journald is available:
# Check if systemd-journald is running
systemctl status systemd-journald
# Check if journald logging is enabled
cat /etc/systemd/journald.conf | grep StorageOn systems without journald (Docker Desktop for Windows/macOS):
Switch to a different driver. journald is not available on Windows or macOS Docker Desktop.
docker run --log-driver=json-file myimage
# or
docker run --log-driver=local myimageIf journald is installed but not working:
# Ensure journald is running
sudo systemctl enable systemd-journald
sudo systemctl start systemd-journald
# Restart Docker
sudo systemctl restart dockerThe syslog driver requires a syslog daemon running on the host or a reachable remote syslog server.
Error:
failed to initialize logging driver: Unix syslog delivery errorCheck if syslog is running locally:
# Check rsyslog status
sudo systemctl status rsyslog
# Or check syslog-ng
sudo systemctl status syslog-ng
# Verify syslog socket exists
ls -la /dev/logStart syslog if not running:
sudo systemctl enable rsyslog
sudo systemctl start rsyslogFor remote syslog, verify the address format:
# docker-compose.yml
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.1.100:514" # Use tcp:// or udp://
syslog-facility: daemon
tag: "{{.Name}}"Common mistake - wrong option name:
# WRONG
options:
address: "tcp://localhost:514"
# CORRECT
options:
syslog-address: "tcp://localhost:514"The awslogs driver requires valid AWS credentials with CloudWatch Logs permissions.
Error:
failed to initialize logging driver: NoCredentialProviders: no valid providers in chainOption 1: Use IAM Instance Role (EC2):
Ensure your EC2 instance has an IAM role with CloudWatch Logs permissions:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}Option 2: Use environment variables:
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_REGION=us-east-1
docker run --log-driver=awslogs \
--log-opt awslogs-region=us-east-1 \
--log-opt awslogs-group=my-log-group \
--log-opt awslogs-stream=my-container \
myimageOption 3: Use AWS credentials file:
Create ~/.aws/credentials:
[default]
aws_access_key_id = your_access_key
aws_secret_access_key = your_secret_keyVerify AWS connectivity:
aws logs describe-log-groups --region us-east-1The gcplogs driver requires valid Google Cloud credentials and appropriate IAM permissions.
Error:
failed to initialize logging driver: unable to connect or authenticate with Google Cloud LoggingOption 1: Use GCE VM Service Account (recommended on GCE):
Ensure your VM has the "Cloud Logging Write" scope enabled:
# Check VM scopes
gcloud compute instances describe INSTANCE_NAME --format="get(serviceAccounts)"Option 2: Use Application Default Credentials:
# Authenticate locally
gcloud auth application-default login
# Set the project
export GOOGLE_CLOUD_PROJECT=your-project-idOption 3: Use a service account key:
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
docker run --log-driver=gcplogs \
--log-opt gcp-project=your-project-id \
myimageVerify Google Cloud connectivity:
gcloud logging write test-log "Test message"Note: Sometimes simply restarting the server resolves transient authentication issues with gcplogs.
The Splunk driver sends logs to Splunk HTTP Event Collector (HEC).
Common issues:
1. HEC endpoint unreachable
2. Invalid HEC token
3. TLS certificate errors
Test HEC connectivity first:
curl -k https://splunk.example.com:8088/services/collector/healthTest with a simple event:
curl -k https://splunk.example.com:8088/services/collector \
-H "Authorization: Splunk YOUR_HEC_TOKEN" \
-d '{"event": "test"}'Correct Splunk driver configuration:
docker run --log-driver=splunk \
--log-opt splunk-token=YOUR_HEC_TOKEN \
--log-opt splunk-url=https://splunk.example.com:8088 \
--log-opt splunk-insecureskipverify=true \
myimageIn docker-compose.yml:
logging:
driver: splunk
options:
splunk-token: "YOUR_HEC_TOKEN"
splunk-url: "https://splunk.example.com:8088"
splunk-verify-connection: "false"
splunk-insecureskipverify: "true" # For self-signed certsNote: All log-opts values must be strings (enclosed in quotes).
The Loki driver (Docker plugin) sends logs to Grafana Loki.
Error:
Cannot start service: failed to initialize logging driver: error creating loki loggerInstall the Loki Docker plugin:
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissionsVerify plugin is installed and enabled:
docker plugin lsCheck Loki is accessible:
curl http://loki.example.com:3100/readyCorrect Loki configuration:
# docker-compose.yml
logging:
driver: loki
options:
loki-url: "http://loki.example.com:3100/loki/api/v1/push"
loki-batch-size: "400"
loki-retries: "3"If using authentication:
options:
loki-url: "http://loki.example.com:3100/loki/api/v1/push"
loki-external-labels: "job=docker,container={{.Name}}"
loki-tenant-id: "tenant1"Common issue - Loki URL format:
# WRONG - missing /loki/api/v1/push
loki-url: "http://loki:3100"
# CORRECT
loki-url: "http://loki:3100/loki/api/v1/push"On Synology NAS systems, Docker can encounter a locked logging database.
Error:
failed to initialize logging driver: database is lockedSolution 1: Duplicate the container settings:
1. Open Docker app in Synology DSM
2. Stop the problematic container
3. Right-click on the container -> Settings -> Duplicate Settings
4. This creates a new container with the same settings
5. Delete the old container and use the new one
Note: Local port mappings will be set to "Auto" and need to be reconfigured manually.
Solution 2: Restart Docker package:
1. Open Package Center in DSM
2. Find Docker and click Stop
3. Wait 30 seconds
4. Click Start
Solution 3: SSH and clear the lock:
sudo synoservice --restart pkgctl-DockerRoot cause: The logging database for the specific container has been locked by another process, possibly due to an improper shutdown or resource contention.
Incorrect log-opts syntax is a common cause of initialization failures.
Important: All log-opts values in daemon.json must be strings:
// WRONG - numeric and boolean values
{
"log-driver": "json-file",
"log-opts": {
"max-size": 10m,
"max-file": 3,
"compress": true
}
}
// CORRECT - all values as strings
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}In docker-compose.yml:
# Ensure all options are quoted strings
logging:
driver: json-file
options:
max-size: "10m" # String
max-file: "3" # String, not integer
compress: "true" # String, not booleanValidate daemon.json:
cat /etc/docker/daemon.json | jq .Restart Docker after configuration changes:
sudo systemctl daemon-reload
sudo systemctl restart docker### Supported Logging Drivers by Platform
Not all logging drivers are available on all platforms:
| Driver | Linux | Windows | macOS (Desktop) |
|--------|-------|---------|-----------------|
| json-file | Yes | Yes | Yes |
| local | Yes | Yes | Yes |
| syslog | Yes | No | No |
| journald | Yes (systemd) | No | No |
| gelf | Yes | Yes | Yes |
| fluentd | Yes | Yes | Yes |
| awslogs | Yes | Yes | Yes |
| splunk | Yes | Yes | Yes |
| gcplogs | Yes | Yes | Yes |
### Dual Logging for docker logs Support
Some logging drivers (syslog, journald, gelf, fluentd, awslogs, splunk, gcplogs) don't support the docker logs command by default. Docker 20.10+ supports "dual logging" which sends logs to both the driver and a local cache:
{
"log-driver": "splunk",
"log-opts": {
"splunk-token": "YOUR_TOKEN",
"splunk-url": "https://splunk:8088",
"cache-disabled": "false",
"cache-max-size": "100m"
}
}### Non-Blocking Mode for High-Throughput Containers
For containers that generate logs faster than the driver can process them, enable non-blocking mode:
{
"log-driver": "syslog",
"log-opts": {
"mode": "non-blocking",
"max-buffer-size": "4m"
}
}Warning: In non-blocking mode, logs may be dropped if the buffer fills up.
### Troubleshooting Remote Logging Connectivity
Test network connectivity:
# TCP connection test
nc -zv logging.example.com 514
# DNS resolution
nslookup logging.example.com
# Curl test (for HTTP-based drivers)
curl -v https://logging.example.com:8088/healthCheck firewall rules:
# iptables
sudo iptables -L -n | grep 514
# firewalld
sudo firewall-cmd --list-all### Using the local Driver as an Alternative
The local driver is a good alternative to json-file with automatic log rotation:
{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}Benefits:
- Built-in log rotation (unlike json-file default)
- More efficient binary format
- Supports docker logs command
- No external dependencies
### Kubernetes/Docker Swarm Considerations
In orchestrated environments, logging driver failures can cause:
- Pods/tasks stuck in "ContainerCreating" state
- Service deployments timing out
- Rolling updates failing
Always test logging driver configuration on a single node before deploying cluster-wide.
unable to configure the Docker daemon with file /etc/docker/daemon.json
How to fix 'unable to configure the Docker daemon with file daemon.json' in Docker
docker: Error response from daemon: OCI runtime create failed: container_linux.go: starting container process caused: exec: "/docker-entrypoint.sh": stat /docker-entrypoint.sh: no such file or directory
How to fix 'exec: entrypoint.sh: no such file or directory' in Docker
image operating system "linux" cannot be used on this platform
How to fix 'image operating system linux cannot be used on this platform' in Docker
dockerfile parse error line 5: unknown instruction: RRUN
How to fix 'unknown instruction' Dockerfile parse error in Docker
manifest unknown: manifest unknown
How to fix 'manifest unknown' in Docker