Week6 - noramehesz/gyak GitHub Wiki

AWS

A feladat végrehajtásának első lépésében regisztráltam AWS-re.


A eheti feladat elvégzéséhez szükség volt egy olyan alkalmazásra, ami porton hallgatózik, ehhez az egyik lehetőség egy Spring Boot app. Ehhez először leszedtem egy STS IDE-t, majd innen pedig generáltattam egy projektet az alábbi beállításokkal :

  • maven project
  • java
  • 2.1.0
  • search for dependencies: web, devtools

A többi beállítást változatlanul hagytam. A letöltött projektet beimportáltam az STS-be. A java osztályt kiegészítettem, hogy a localhost-on egy Hello-t írjon ki nekem, ha eindítom.

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class DemoApplication {
	
	@RequestMapping("/")
	  public String home() {
	    return "Hello";
	  }

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

Az elején volt egy olyan problémám, hogy a 8080-as portot használta valami. Ezt szabaddá akartam tenni, amit úgy oldattam meg, hogy az alábbi paranccal megkerestem , hogy ki használja:

netstat -ano | findstr 8080

A legjobboldali oszlop volt a PID-je annak, ami hasznája, a task manager-ben kikerestem ezt és leállítottam. Ezután ezzel már nem volt probléma , a localhost-on szépen kiírta a várt Hello-t.

Volt erre megoldásként még egy olyan javaslat stackoverflow-n, hogy a skype is várhat ezen a proton bármit, és ezt annak a beállításain belül ki lehetett kapcsolani, amit megtettem, de ez nem segített.

Ezek után a Jenkinst dockeren keresztül futtattam, annak a 8. build-je sikeres is lett

Itt csak a maven miatt voltak problémák, de azokat könnyen ki lehetett küszöbölni.


Ezek után szerettem volna a projektemből egy docker image-t készíteni és azt futtatni. Többféle Dockerfile-t is írtam, a build mindig sikeres volt.

Dockerfile1.0:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

Dockefile2.0:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD  spring.jar target/app.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","target/app.jar"]

Dockerfile3.0:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD  spring.jar target/app.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]

Dockerfile4.0:

FROM openjdk:8-jdk-alpine
EXPOSE 8080
ADD spring.jar spring.jar
ENTRYPOINT ["java", "-jar", "spring.jar"]

De a run egyikkel sem jó.

docker run springdemo Error: Invalid or corrupt jarfile target/app.jar

docker run -p 8080:8080 springdemo Itt meg foglalt a port.

Innen nem jutottam tovább, az első error az amire megoldást kerestem, de eddig nem találtam. Azt a portot meg semmi nem használja.


Végső megoldásként, amivel siekrrel jártam átírtam a dockerfile-t , és a tomcat-t a default 8080-as portról átírtam a 9000es portra. DOCKERFILE:

FROM java:8
WORKDIR / 
ADD target/demo-0.0.1-SNAPSHOT.jar demo.jar
EXPOSE 9000
ENTRYPOINT ["java","-jar","demo.jar"]

A port átírása csak egy sort vett igénybe az application.properties-ben:

 server.port=9000

Így már sikerült docker build-re elkészítei az imaget, a maven-es build és sikeres volt. Docker run paranccsal pedig a localhost:9000-en meg is tekinthettem a várt 'Hello'-t. Ezutá kellett dockerhub-ra felpush-olni, amihez az alábbi 2 parancsot használtam:

tag my_image $DOCKER_ID_USER/my_image

push $DOCKER_ID_USER/my_image

Így a DockerHub felhasználómnál webes felületről sem volt szükség arra, hogy külön létrehozzak egy repo-t , mert ez megtette helyettem.

Ezek után kellett az AWS-en egy Elasti Beanstalk app-ot létrehozni. Az alábbi videót használtam fel hozzá. Ez alapján elkészítettem a megfelelő json file-t , melynek tartalma az alábbi:

{
  "AWSEBDockerrunVersion": "1",
  "Image": {
          "Name": "noramehesz/stsmavendemo"
  },
  "Ports": [
          {"ContanierPort": "9000"}
  ]
}

Viszont ennél tovább nem jutottam. A file felltöltésekor hibát kaptam, konkrétan ezt:

Fogalmam sincs mi lehett a probléma, először annyit csináltam, hogy minden előről kezdtem, minden kiszedtem a image-k közül és az összes konténert leállítottam, újra build-elem, újra feltettem dockerhub-ra, onnan újra EB-re, de mindig, minden alkalommal ugyenzt kaptam.


További linkek:

https://www.infoq.com/articles/microframeworks1-spring-boot

https://spring.io/guides/gs/spring-boot-docker/

https://docs.docker.com/docker-cloud/builds/push-images/