Nie miałem pomysłu jak lepiej nazwać ten temat, postaram się więć wytłumaczyć.
Mam aplikację która składa się ze Springa oraz Angulara, całość znajduje się w jednym projekcie Mavenowym, podzielonym na dwa moduły. Dodatkowo nad wszystkim stoi Docker.
Mam więc folder parenta, który ma swój pom.xml
<groupId>com.example</groupId>
<artifactId>parent-app</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modules>
<module>app-ui</module>
<module>app-server</module>
</modules>
No i schodząc niżej, app-ui
to wspomniany frontend Angularowy, który również ma swojego pom.xml
, w którym odpalany jest plugin do zbudowania tego frontendu jak i zainstalowania node, npm, itp.
<parent>
<groupId>com.example</groupId>
<artifactId>parent-app</artifactId>
<version>1.0</version>
</parent>
<artifactId>app-ui</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<nodeVersion>v12.16.3</nodeVersion>
<npmVersion>6.12.1</npmVersion>
<workingDirectory>src/main/web/app-ui</workingDirectory>
</configuration>
<executions>
<execution>
<id>install node and 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 run build</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run build</arguments>
</configuration>
</execution>
<execution>
<id>prod</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run-script build</arguments>
</configuration>
<phase>generate-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
Jak się można domyśleć, w moim app-server
jest plugin który kopiuje zbudowany /dist
i wrzuca jako static resources mojej aplikacji Springowej.
No i to działa, gdy odpalam to bez dockera. Problem pojawia gdy wszystko odpalam poprzez Dockera, którego Dockerfile
wygląda tak
FROM maven:latest AS MAVEN_BUILD
COPY pom.xml /build/
COPY app-server/pom.xml /build/app-server/
COPY app-server/src /build/app-server/src
COPY app-ui/pom.xml /build/app-ui/
COPY app-ui/src /build/app-ui/src
WORKDIR /build
RUN mvn clean install
FROM openjdk:latest
WORKDIR /app
COPY --from=MAVEN_BUILD /build/app-server/target/app-server-1.0.war /app
EXPOSE 8080
CMD java -jar app-server-1.0.war
Problem zaczyna się pojawiać już przy budowaniu pierwszej częsci, czyli app-ui
, w logach widzę że instalowany jest node i npm, czyli wszystko ok
[INFO] Installing node version v12.16.3
[INFO] Downloading https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.gz to /root/.m2/repository/com/github/eirslett/node/12.16.3/node-12.16.3-linux-x64.tar.gz
Ale potem, odpalane jest npm run build
a pod spodem ng build
, i to kończy się już błędem...
[INFO] > ng build
[INFO]
[ERROR] sh: ng: command not found
[ERROR] npm ERR! code ELIFECYCLE
[ERROR] npm ERR! syscall spawn
[ERROR] npm ERR! file sh
[ERROR] npm ERR! errno ENOENT
[ERROR] npm ERR! app-ui@0.0.0 build:ng build
[ERROR] npm ERR! spawn ENOENT
[ERROR] npm ERR!
[ERROR] npm ERR! Failed at the app-ui@0.0.0 build script.
[ERROR] npm ERR! This is probably not a problem with npm. There is likely additional logging output above.