spring-projects/spring-boot · error · IllegalStateException
Error reading Docker configuration file '{}'
Error message
Error reading Docker configuration file '{}' What it means
readPathContent calls Files.readString(path) and wraps any IOException in IllegalStateException. Note the message always says 'Docker configuration file' but readPathContent is shared by both createDockerConfig (config.json) and createDockerContext (meta.json); the path substituted into the message tells you which file failed. Because existence was already checked by the caller, an IOException here almost always means a permission/race/encoding problem rather than a missing file.
Source
Thrown at buildpack/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/configuration/DockerConfigurationMetadata.java:166
}
private static String asHash(String currentContext) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(currentContext.getBytes(StandardCharsets.UTF_8));
return HexFormat.of().formatHex(hash);
}
catch (NoSuchAlgorithmException ex) {
throw new IllegalStateException("SHA-256 is not available", ex);
}
}
private static String readPathContent(Path path) {
try {
return Files.readString(path);
}
catch (IOException ex) {
throw new IllegalStateException("Error reading Docker configuration file '" + path + "'", ex);
}
}
static final class DockerConfig extends MappedObject {
private final @Nullable String currentContext;
private final @Nullable String credsStore;
private final Map<String, String> credHelpers;
private final Map<String, Auth> auths;
private DockerConfig(JsonNode node) {
super(node, MethodHandles.lookup());
this.currentContext = valueAt("/currentContext", String.class);
this.credsStore = valueAt("/credsStore", String.class);
this.credHelpers = mapAt("/credHelpers", JsonNode::stringValue);View on GitHub (pinned to 270dfe353f)
Solutions
- Check and fix permissions: `ls -l <path>` then `chmod +r <path>`.
- Ensure the path is a regular file, not a directory or special file.
- If this is a concurrency/race, ensure a single owner of the docker config dir during the build.
Defensive patterns
Strategy: validation
Validate before calling
// Pre-check readability of the docker config files
Path cfg = resolveConfigPath();
if (Files.exists(cfg) && !Files.isReadable(cfg)) {
throw new IllegalStateException("Docker config file " + cfg + " is not readable (check permissions).");
} Try / catch
try {
build.run();
} catch (IllegalStateException ex) {
if (ex.getCause() instanceof IOException
&& ex.getMessage().startsWith("Error reading Docker configuration file")) {
// hint: check file permissions / mount health
}
throw ex;
} Prevention
- Ensure the user running the build has read access to ~/.docker (chmod +r).
- Avoid concurrent processes that delete or rewrite the docker config dir mid-build.
- On network mounts, ensure the mount stays healthy during the build.
When it happens
Trigger: Files.readString(path) at line 163 throws IOException: permission denied, path is a directory, file bytes are not valid UTF-8 and cannot be decoded, or the file was removed between the caller's exists() check and the read.
Common situations: config.json or meta.json chmod 000 or owned by another user; file on a network mount that became inaccessible; antivirus locking the file on Windows; concurrent process deleting the file.
Related errors
- Error parsing Docker configuration file '{}'
- Docker context '{}' does not exist
- Error parsing Docker context metadata file '{}'
- Error creating KeyStore: {}
- File '{}' is not readable
AI-assisted analysis of spring-projects/spring-boot@270dfe353f (2026-08-11).
Data as JSON: /api/errors/5ed4faf2b73db714.
Report an issue: GitHub.