I followed the steps to push docker images to Google Cloud Registry here.
I could manually run docker push eu.gcr.io/[PROJECT_ID]/[IMAGE_TAG], and it would run successfully. However, the dockerfile maven plugin would fail due to missing credentials:
org.apache.maven.plugin.MojoExecutionException: Could not push image
...
Caused by: com.spotify.docker.client.exceptions.DockerException: unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
At this point, my ~/.docker/config.json file looked like:
{
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud"
  }
}
After a lot of debugging, I found a configuration that worked:
{
  "auths": {
    "eu.gcr.io": {}
  },
  "credHelpers": {
    "eu.gcr.io": "gcr"
  },
  "credsStore": "gcr"
}
I had to install the docker-credential-gcr module:
gcloud components install docker-credential-gcr
I have two questions:
- Why did I need to change my configuration in this way?
- Is it worth raising an issue on the GitHub, or was this a weird quirk of my setup?
EDIT:
The relevant part of my Maven config is:
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.4.13</version>
            <configuration>
                <repository>eu.gcr.io/[PROJECT_ID]/[IMAGE_NAME]</repository>
                <tag>2.0.0</tag>
            </configuration>
            <executions>
                <execution>
                    <id>default</id>
                    <goals>
                        <goal>build</goal>
                        <goal>push</goal>
                    </goals>
                </execution>
                <execution>
                    <id>tag-image-latest</id>
                    <goals>
                        <goal>tag</goal>
                    </goals>
                    <configuration>
                        <tag>latest</tag>
                    </configuration>
                </execution>
            </executions>
        </plugin>
 
                        
Try adding
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>inside the configuration tag and specify your server credentials in the maven settings.xml:Also, If you want to push images to the private registry you need two things: API Access Scopes and Authenticate your VM with the registry.
There's already a detalied answer in this post where you can find a deep understanding to your question.
Hope that you find it helpful.