'Running "ng build" in docker container gives "project definition could not be found"
I'm trying to build an Angular + Spring-boot project using Maven and deploy it as a docker container. To compile the application I run
mvn package
which at some point runs ng build
.
It works as intended when I do it on my local machine. But when I copy files into a docker image and try to run mvn package
, I get an error
[INFO] --- frontend-maven-plugin:1.11.2:npm (npm-build) @ tradingSandbox ---
[INFO] Running 'npm run-script build' in /
[INFO]
[INFO] > [email protected] build /
[INFO] > ng build
[INFO]
[INFO] The build command requires to be run in an Angular project, but a project definition could not be found.
[INFO] npm ERR! code ELIFECYCLE
[INFO] npm ERR! errno 1
[INFO] npm ERR! [email protected] build: `ng build`
[INFO] npm ERR! Exit status 1
[INFO] npm ERR!
[INFO] npm ERR! Failed at the [email protected] build script.
[INFO] npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
[INFO]
[INFO] npm ERR! A complete log of this run can be found in:
[INFO] npm ERR! /root/.npm/_logs/2021-02-23T09_15_24_641Z-debug.log
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
The root directory contains proper angular.json
file and Maven downloads correct version of nodejs. Because it is inside a docker image, I am unable to access debug.log
. Needless to say I am unexperienced with using a Docker.
Dockerfile
FROM maven:3.6.3-jdk-11
COPY . /
RUN cd /
RUN ls -a
ENV PORT=8080
RUN mvn package
CMD mvn spring-boot:run -Dspring-boot.run.profiles=$PROFILE -Dserver.port=$PORT
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>tradingSandbox</artifactId>
<version>0.0.1</version>
<name>tradingSandbox</name>
<description>Trading sandbox</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Database controller for deployment -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Database controller for testing -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.7</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.11.2</version>
<configuration>
<nodeVersion>v12.18.4</nodeVersion>
</configuration>
<executions>
<execution>
<id>install-npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
</execution>
<execution>
<id>npm-install</id>
<goals>
<goal>npm</goal>
</goals>
</execution>
<execution>
<id>npm-build</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run-script build</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Solution 1:[1]
You are in the wrong directory. It can not find the angular.json
file.
remove
RUN cd /
from your dockerfile.
Make sure that RUN ls -a
returns the directory which holds angular.json
, and if it doesn't, configure RUN cd blabla
correctly.
Solution 2:[2]
Got the same issue today. Even though RUN ls -la
gave me the correct directory, setting an explicit WORKDIR
fixed it for me
WORKDIR /var/www
I put this as the second line in my Dockerfile after the FROM ...
line. The directory shouldn't matter as WORKDIR
creates it if it doesn't exist.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Mike S. |
Solution 2 | DraughtGlobe |