Docker-maven-plugin: Unable to locate the project artifact during docker:build

Created on 24 Feb 2016  路  7Comments  路  Source: fabric8io/docker-maven-plugin

I am unable to really figure out which relative path is used by docker during the build process. Hence this request.
The docker:build always fails with the output

[INFO] --- docker-maven-plugin:0.13.9:build (default-cli) @ sample-spring-boot-docker ---
[INFO] Copying files to /home/vagrant/SampleApp/greeting-service/target/docker/greeting-service/build/maven
[INFO] Building tar: /home/vagrant/SampleApp/greeting-service/target/docker/greeting-service/tmp/docker-build.tar
[ERROR] DOCKER> Error building image: lstat build/maven/sample-spring-boot-docker-0.1.0.jar: no such file or directory
[ERROR] DOCKER> lstat build/maven/sample-spring-boot-docker-0.1.0.jar: no such file or directory
[ERROR] DOCKER> lstat build/maven/sample-spring-boot-docker-0.1.0.jar: no such file or directory
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE

The pom.xml, Dockerfile and find output is given below:

<plugin>
                <groupId>org.jolokia</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.13.9</version>
                <configuration>
                    <images>
                        <image>
                        <name>greeting-service</name>
                        <build>
                            <assembly>
                                <descriptorRef>artifact</descriptorRef>
                                <dockerFileDir>.</dockerFileDir>
                            </assembly>
                        </build>
                        </image>
                    </images>
                </configuration>
            </plugin>
FROM somebaseimage

ADD sample-spring-boot-docker-0.1.0.jar app.jar
....
vagrant@greeting-service-host:~/SampleApp/greeting-service/target/docker$ find .
.
./greeting-service
./greeting-service/build
./greeting-service/build/maven
./greeting-service/build/maven/sample-spring-boot-docker-0.1.0.jar
./greeting-service/tmp
./greeting-service/tmp/docker-build.tar
./greeting-service/work

Most helpful comment

@nitin-tiwari

pom.xml

    <build>
        <plugins>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.14.0</version>
                <configuration>
                    <images>
                        <image>
                            <alias>some-service-name-1</alias>
                            <name>${localregistry}/${docker.image.prefix}/some-service-name</name>
                            <build>
                                <assembly>
                                    <descriptorRef>artifact</descriptorRef>
                                    <dockerFileDir>${project.basedir}/.</dockerFileDir>
                                </assembly>
                            </build>
                            <run>
                                <namingStrategy>alias</namingStrategy>
                                                                <envPropertyFile>LocalEnv</envPropertyFile>
                                <net>pod-network</net>
                                <ports>
                                                                        <port>8001:7199</port>
                                    <port>8000:8080</port>
                                </ports>
                            </run>
                        </image>
                    </images>
                </configuration>
                <executions>
                    <execution>
                        <id>start</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>build</goal>
                            <goal>start</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>stop</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Dockerfile

FROM which_ever_base_image
ADD maven/some-service-spring-boot-docker-0.1.0.jar app.jar
CMD java -jar app.jar

All 7 comments

You have to distinguish between two build modes:

  • One with an assembly which is completely configured within the pom.xml
  • One with a dockerFileDir

Both are currently more or less orthogonal (however there is work to let a Dockerfile reference the assembly defined in the pom).

In your example you are using more or less both which at least seems to copy the assembly in the build directory. When you then use dockerFileDir then the build dir is the context dir for the Docker build. So you should use ADD maven/sample-spring-boot-docker-0.1.0.jar app.jar in the Dockerfile.

However, this approach is not recommended, since you would need to update the version number all the time. Instead you should use an assembly which maps the artifact name to a fixed outputFileName (this can be done in a custom assembly descriptor). Also, you could use a basedir / in the plugin's build>assembly configuration so that it will be automatically added and you wouldn't need to specify a dockerfile dir.

Do you have the full example as a github project ? If so, I could send you a PR with my suggestions.

Thanks Roland for the update.

  • You are right, the version number of the jar is hardcoded now in the Dockerfile
  • So does that mean, I should add another assembly block all together? For example, is the below code valid? Sorry, I am not very familiar with assembly plugin.
<configuration>
                    <images>
                        <image>
                        <name>greeting-service</name>
                        <build>
                            <assembly>
                                <dockerFileDir>.</dockerFileDir>
                            </assembly>
                            <assembly>
                                <descriptorRef>artifact</descriptorRef>
                                <outputFileName>app.jar<outputFileName>
                            </assembly>                        
                           </build>
                        </image>
                    </images>
                </configuration>
  • Going with the last approach, I did the following change and it gave me the same error DOCKER> Error building image: lstat sample-spring-boot-docker-0.1.0.jar: no such file or directory
                        <build>
                            <assembly>
                                <basedir>/</basedir>
                                <descriptorRef>artifact</descriptorRef>
                                <dockerFileDir>.</dockerFileDir>
                            </assembly>
                        </build>

Roland,
I still dont get how I can reference files that are in different directories to be included while building the image using a Dockerfile. Currently I am giving relative path from the build which doesn't look that nice for me. In fact it gives the below error:
DOCKER> Error building image: Forbidden path outside the build context: ../../src/main/resources/config/application.yml
Is there any way to include additional files that will get copied into the build directory so that when the docker build runs it can find all of them?

If you want to reference artifact / dependencies and files from different directory I really recommend to use only an own assembly (not a predefined as described with artifactRef but of course this could be also used as a blueprint

Within the assembly you can define so called filesets which refers to plain files. This all is documented in the documentation to the assembly plugin (and also, please read the plugins documentation which explains how to include the assembly).

With the dockerfile mode this is not easy possible. You could do the copying on your own with e.g. the resource plugin, but that's quite involved.

Thanks Roland. I managed to currently build it with a mix of stuff.
I have another question regarding the phases. In my Jenkins job I am only calling mvn clean install test and I see that a docker start is being attempted. The executions block in the pom.xml looks like the following:

<executions>
    <execution>
        <id>start</id>
        <phase>pre-integration-test</phase>
        <goals>
            <goal>build</goal>
            <goal>start</goal>
        </goals>
    </execution>
    <execution>
        <id>stop</id>
        <phase>post-integration-test</phase>
        <goals>
            <goal>stop</goal>
        </goals>
    </execution>
</executions>

I am not sure why a run is being invoked when I do an mvn test.

@vrenjith I'm facing the similar issue, where I'm trying to build and run the image from a different module than the one where Dockerfile is. Apparently you solved the problem of jar not being located can you please share your config to refer to the dependencies from different module?

@nitin-tiwari

pom.xml

    <build>
        <plugins>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.14.0</version>
                <configuration>
                    <images>
                        <image>
                            <alias>some-service-name-1</alias>
                            <name>${localregistry}/${docker.image.prefix}/some-service-name</name>
                            <build>
                                <assembly>
                                    <descriptorRef>artifact</descriptorRef>
                                    <dockerFileDir>${project.basedir}/.</dockerFileDir>
                                </assembly>
                            </build>
                            <run>
                                <namingStrategy>alias</namingStrategy>
                                                                <envPropertyFile>LocalEnv</envPropertyFile>
                                <net>pod-network</net>
                                <ports>
                                                                        <port>8001:7199</port>
                                    <port>8000:8080</port>
                                </ports>
                            </run>
                        </image>
                    </images>
                </configuration>
                <executions>
                    <execution>
                        <id>start</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>build</goal>
                            <goal>start</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>stop</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Dockerfile

FROM which_ever_base_image
ADD maven/some-service-spring-boot-docker-0.1.0.jar app.jar
CMD java -jar app.jar
Was this page helpful?
0 / 5 - 0 ratings