Maxim Kirilov
Maxim Kirilov

Reputation: 2749

Tagging created image with dockerfile-maven-plugin

I am using dockerfile-maven-plugin with the following configuration:

  <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.3.6</version>
    <executions>
        <execution>
            <id>build-image</id>
            <goals>
                <goal>build</goal>
            </goals>
            <configuration>
                <tag>latest</tag>
                <repository>root/${project.artifactId}</repository>
                <buildArgs>
                    <APP_NAME>${project.artifactId}</APP_NAME>
                </buildArgs>
            </configuration>
        </execution>
        <execution>
            <id>push-image</id>
            <goals>
                <goal>push</goal>
            </goals>
            <configuration>
                <repository>${docker.registry.url}/root/${project.artifactId}</repository>
            </configuration>
        </execution>
    </executions>
</plugin>

Project deployment fails due to:

[INFO] The push refers to a repository [my-repository:9090/root/image-name]
[ERROR] An image does not exist locally with the tag: my-repository:9090/root/image-name
[WARNING] An attempt failed, will retry 1 more times
org.apache.maven.plugin.MojoExecutionException: Could not push image
.
.
.

Prefixing the repository under the build goal (in similar way to push goal) solves the issue. But then the locally created image prefixed with the repository tag.

Didn't find any documentation reference on how to perform the tag before push task.

In other words, I want that my local docker images will contain 2 images after plugin execution:

REPOSITORY                                        TAG                 IMAGE ID            CREATED             SIZE
root/image-name                                   latest              7ac1144c607e        21 minutes ago      175MB
my-repository:9090/root/image-name                latest              7ac1144c607e        21 minutes ago      175MB

My docker version is: 17.06.0-ce

Upvotes: 2

Views: 9316

Answers (3)

Samir Shaik
Samir Shaik

Reputation: 1095

We didn't want to build all over again even if existing docker layers would be used. In the first execution we build and push and in the second execution we just tag and push.

<build>
  <plugins>
    <plugin>
      <groupId>com.spotify</groupId>
      <artifactId>dockerfile-maven-plugin</artifactId>
      <version>${dockerfile-maven-plugin.version}</version>
      <executions>
        <execution>
          <id>default</id>
          <goals>
            <goal>build</goal>
            <goal>push</goal>
          </goals>
          <configuration>
            <tag>${build.number}</tag>
          </configuration>
        </execution>
        <execution>
          <id>default-2</id>
          <goals>
            <goal>tag</goal>
            <goal>push</goal>
          </goals>
          <configuration>
            <tag>latest</tag>
          </configuration>
        </execution>
      </executions>
      <configuration>
        <repository>${docker-remote.registry}/path/${project.version.lowercase}</repository>
        <buildArgs>
        <EAR_FILE>${project.build.finalName}.ear</EAR_FILE>
        </buildArgs>
        <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
      </configuration>
    </plugin>
  </plugins>
</build>

Upvotes: 5

fgk
fgk

Reputation: 308

You can also tag your image manually after a successful build with

mvn dockerfile:tag -Dproject.plugin.dockerfile.tag=my-repository:9090/root/image-name

Upvotes: 0

Maxim Kirilov
Maxim Kirilov

Reputation: 2749

Adding additional execution step to my configuration solved the issue:

<execution>
    <id>tag-image</id>
    <phase>deploy</phase>
    <goals>
        <goal>tag</goal>
    </goals>
    <configuration>
        <repository>${docker.registry.url}/root/${project.artifactId}</repository>
    </configuration>
</execution>

Upvotes: 2

Related Questions