static boolean isRelativePath(String candidatePath) {

        // java.io.File considers Windows paths to be absolute _only_ if they start with a drive letter.  That is,
        // a Windows path '\foo\bar\baz' is _not_ considered absolute by File#isAbsolute.  This block differs from
        // java.io.File in that it considers Windows paths to be absolute if they begin with the file separator _or_ a
        // drive letter
        if (candidatePath.startsWith(UNIX_SEP) ||
                candidatePath.startsWith(WINDOWS_SEP) ||
                WINDOWS_DRIVE_PATTERN.matcher(candidatePath).matches()) {
            return false;
        }

        // './' or '../'
        if (candidatePath.startsWith(DOT + RUNTIME_SEP) || candidatePath.startsWith(DOT + DOT + RUNTIME_SEP)) {
            return true;
        }

        if (candidatePath.contains(UNIX_SEP) || candidatePath.contains(WINDOWS_SEP)) {
            return true;
        }

        if (isUserHomeRelativePath(candidatePath)) {
            return true;
        }

        return false;
    }
Determines if the supplied volume binding path contains a relative path.  This is subtle, because volume
bindings may specify a named volume per the discussion below.
<h3>Discussion:</h3>
<p>
Volumes may be defined inside of {@code service} blocks <a href="https://docs.docker.com/compose/compose-file/compose-file-v2/#volumes-volume_driver">
as documented here</a>:
</p>
<pre>
volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql

# Specify an absolute path mapping
- /opt/data:/var/lib/mysql

# Path on the host, relative to the Compose file
- ./cache:/tmp/cache

# User-relative path
- ~/configs:/etc/configs/:ro

# Named volume
- datavolume:/var/lib/mysql"
</pre>
<p>
Volume binding paths that begin with {@code ./}, {@code ../}, or {@code ~} clearly represent a relative path.
However, binding paths that do not begin with those characters may represent a <em>named volume</em>.  For
example, the binding string {@code rel:/path/to/container/mountpoint} refers to the <em>named volume</em> {@code
rel}. Because it is desirable to fully support relative paths for volumes provided in a run configuration, this
method attempts to resolve the ambiguity between a <em>named volume</em> and a <em>relative path</em>.
</p>
<p>
Therefore, volume binding strings will be considered to contain a relative path when any of the following
conditions are true:
<ul>
    <li>the volume binding path begins with {@code ./}, {@code ../}, or {@code ~}</li>
    <li>the volume binding path contains the character {@code /} <em>and</em> {@code /} is not at index 0 of
        the volume binding path</li>
</ul>
</p>
<p>
If the binding string {@code rel:/path/to/container/mountpoint} is intended to represent {@code rel} as a
<em>relative path</em> and not as a <em>named volume</em>, then the binding string should be modified to contain
a forward slash like so: {@code rel/:/path/to/container/mountpoint}.  Another option would be to prefix {@code
rel} with a {@code ./} like so: {@code ./rel:/path/to/container/mountpoint}
</p>


@param candidatePath the candidate volume binding path
@return true if the candidate path is considered to be a relative path
src/main/java/io/fabric8/maven/docker/util/VolumeBindingUtil.java