The 'Additional property is not allowed' error in Docker Compose occurs when your docker-compose.yml file contains an unrecognized property name. This is usually caused by typos, incorrect indentation, missing the 'services' key, or using features not supported by your Compose version.
The "Additional property X is not allowed" error is Docker Compose's way of telling you that it found a property in your YAML file that doesn't belong where you placed it. Docker Compose validates your file against a schema, and this error triggers when: 1. **A property is misplaced**: You've put a valid property in the wrong location (e.g., `deploy` at the root level instead of under a service) 2. **A property is misspelled**: Common typos like `enviroment` instead of `environment`, or `service` instead of `services` 3. **Indentation is wrong**: YAML is whitespace-sensitive, and incorrect indentation can make a property appear at the wrong level 4. **Missing parent key**: Services defined without a `services:` parent key in Compose file version 2+ The error message format is helpful: `services.myservice Additional property X is not allowed` tells you exactly which property (`X`) is problematic and where it was found (`services.myservice`). Docker Compose has different file format versions (2.x, 3.x, and the modern Compose Specification), each with its own valid properties. Using a feature from a newer version with an older docker-compose tool will also trigger this error.
The error message tells you exactly which property is problematic. Read it carefully:
services.web Additional property enviroment is not allowedIn this example:
- Location: services.web - the problem is in the "web" service
- Property: enviroment - this is the unrecognized property (note the typo!)
Common typos to look for:
| Wrong | Correct |
|-------|---------|
| enviroment | environment |
| sevices | services |
| service | services |
| env_files | env_file |
| port | ports |
| volume | volumes |
| depens_on | depends_on |
| bulid | build |
In Compose file version 2 and later, all service definitions must be nested under a services: key. This is the most common cause of this error for beginners.
Wrong - services at root level:
version: "3"
web:
image: nginx
ports:
- "80:80"Correct - services under 'services:' key:
version: "3"
services:
web:
image: nginx
ports:
- "80:80"If you see an error like (root) Additional property web is not allowed, this is almost certainly the cause.
YAML requires consistent indentation with spaces (not tabs). Incorrect indentation can make properties appear at the wrong level.
Wrong - deploy appears as a separate service:
services:
web:
image: nginx
deploy: # Wrong! This looks like a service named "deploy"
replicas: 3Correct - deploy is a property of web:
services:
web:
image: nginx
deploy: # Correct! Indented under web
replicas: 3Use a YAML validator or your editor's YAML support to check indentation. Most editors can visualize indentation levels.
To check for tabs vs spaces:
# Show tabs as ^I
cat -A docker-compose.yml
# Or use grep to find tabs
grep -P '\t' docker-compose.ymlIf you find tabs, replace them with spaces (typically 2 spaces per level):
# Replace tabs with 2 spaces
sed -i 's/\t/ /g' docker-compose.ymlUse Docker Compose's built-in validation to check your file:
# Using Docker Compose V2 (recommended)
docker compose config
# Using legacy docker-compose
docker-compose configThis command parses and validates your file, showing exactly where problems occur. If the file is valid, it outputs the processed configuration.
You can also use online validators:
- [Docker Compose Validator](https://yamlchecker.com/) - General YAML validation
- Your IDE's built-in YAML/Docker Compose support
For a quick syntax check without running Docker:
# Check YAML syntax with Python
python3 -c "import yaml; yaml.safe_load(open('docker-compose.yml'))"Some properties are only available in newer Docker Compose versions. Check your version:
docker compose version
# or
docker-compose --versionCommon properties and their minimum version requirements:
| Property | Minimum Version |
|----------|-----------------|
| include | Docker Compose 2.20.0 |
| configs.*.content | Docker Compose 2.23.0 |
| deploy.replicas | Compose file version 3.0+ |
| healthcheck | Compose file version 2.1+ |
| platform | Docker Compose 2.4.0 |
If you're using a feature not supported by your version, either:
1. Upgrade Docker Compose: sudo apt-get update && sudo apt-get install docker-compose-plugin
2. Remove the unsupported property from your file
3. Use an alternative approach compatible with your version
Docker Compose only allows specific top-level keys. Using anything else triggers this error.
Valid top-level keys:
version: "3.8" # Optional in Compose V2
name: my-project # Project name (optional)
services: # Service definitions (required)
networks: # Network definitions (optional)
volumes: # Volume definitions (optional)
configs: # Config definitions (optional)
secrets: # Secret definitions (optional)
x-*: # Extension fields (optional)
include: # Include other files (Compose 2.20+)Invalid example:
version: "3"
myservice: # Wrong! Should be under 'services:'
image: nginxThe error (root) Additional property myservice is not allowed means you're defining something at the root level that isn't one of the valid top-level keys.
Each service has a specific set of allowed properties. Common misplacements include:
Wrong - environment under build:
services:
web:
build:
context: .
environment: # Wrong! environment goes under service, not build
- NODE_ENV=prodCorrect - environment under service:
services:
web:
build:
context: .
environment: # Correct! At service level
- NODE_ENV=prodCommon service-level properties:
- image, build, command, entrypoint
- environment, env_file
- ports, expose
- volumes, networks
- depends_on, links
- deploy, healthcheck
- restart, container_name
When in doubt, consult the [Compose Specification](https://docs.docker.com/compose/compose-file/) for the complete list.
### Understanding Compose Schema Validation
Docker Compose validates your file against a JSON schema. The schema defines:
- Which properties are valid at each level
- Required vs optional properties
- Property types (string, array, object)
- Allowed values for certain properties
Starting with Compose V2, validation uses the Compose Specification schema regardless of the version: field. The version field is now obsolete and only informative.
### Common "Additional property" Error Patterns
Pattern 1: `(root) Additional property X is not allowed`
- X is at the top level but isn't a valid top-level key
- Usually means services aren't under services:
Pattern 2: `services.myservice Additional property X is not allowed`
- X is under a service but isn't a valid service property
- Check for typos or wrong nesting level
Pattern 3: `services.myservice.build Additional property X is not allowed`
- X is under the build section but isn't valid there
- build: has limited properties: context, dockerfile, args, etc.
### IDE Support for Validation
Modern IDEs can validate docker-compose.yml files in real-time:
VS Code:
- Install the "Docker" extension
- Install the "YAML" extension by Red Hat
- Add to settings.json:
{
"yaml.schemas": {
"https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json": ["docker-compose*.yml", "compose*.yml"]
}
}JetBrains IDEs (IntelliJ, PyCharm, WebStorm):
- Docker support is built-in
- Enable the Docker plugin for enhanced validation
### Extension Fields (x-*)
If you need custom properties for templating or documentation, use extension fields that start with x-:
x-common-variables: &common-vars
MYSQL_USER: app
MYSQL_PASSWORD: secret
services:
web:
environment:
<<: *common-vars
APP_ENV: productionExtension fields are ignored by Docker Compose and won't trigger validation errors.
### Differences Between Compose Versions
The allowed properties vary between Compose file versions:
| Feature | Version 2.x | Version 3.x |
|---------|-------------|-------------|
| mem_limit | Yes | No (use deploy.resources) |
| cpu_shares | Yes | No (use deploy.resources) |
| deploy | Limited | Full support |
| depends_on.condition | Yes | No (Swarm ignores) |
If you're seeing errors after copying from an old tutorial, check if the properties used are compatible with your Compose file version.
dockerfile parse error line 5: unknown instruction: RRUN
How to fix 'unknown instruction' Dockerfile parse error in Docker
Error response from daemon: manifest for nginx:nonexistent not found: manifest unknown: manifest unknown
How to fix 'manifest for image:tag not found' in Docker
Error response from daemon: invalid reference format: repository name must be lowercase
How to fix 'repository name must be lowercase' in Docker
Error response from daemon: No such image
How to fix 'No such image' in Docker
Error response from daemon: Container is not running
How to fix 'Container is not running' when using docker exec