docker run --name={project_name} -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/{project_name}:latest
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.3.4)
2024-11-24T17:08:44.616+09:00 INFO 15576 --- [persist] [ main] yyytir777.persist.PersistApplication : Starting PersistApplication using Java 17.0.8.1 with PID 15576
2024-11-24T17:08:44.618+09:00 INFO 15576 --- [persist] [ main] yyytir777.persist.PersistApplication : The following 1 profile is active: "prod"
2024-11-24T17:08:45.217+09:00 INFO 15576 --- [persist] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2024-11-24T17:08:45.286+09:00 INFO 15576 --- [persist] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 63 ms. Found 3 JPA repository interfaces.
2024-11-24T17:08:45.792+09:00 INFO 15576 --- [persist] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http)
...(생략)
-d
옵션을 통해 백그라운드에서 컨테이너를 실행할 수 있다.docker run --name={project_name} -d -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/{project_name}:latest
nohup
이라는 명령어를 사용하는 방법이다. HUP신호를 무시하도록 만드는 POSIX명령어라고 한다.nohup.out
이라는 이름의 파일로 처리된다.nohup
을 붙여주기만 하면 된다.jar
파일을 실행하는 Dockerfile
의 명령어에 붙여줄 수 있다.FROM openjdk:17-jdk
ARG JAR_FILE=build/libs/project_name-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} /project_name.jar
ENTRYPOINT ["nohup", "java", "-jar", "-Dspring.profiles.active=prod", "/project_name.jar"]
jar
파일을 실행하고 있다는 것이었다.nohup
은 shell
에서 실행되는 명령어이다. Dockerfile
에서의 ENTRYPOINT
의 명령어는 엄밀히 말해 shell
이 아닌 도커 컨테이너에서 실행되는 명령어였던 것이다.nohup
을 사용하려면 도커가 아닌 직접 jar
파일을 실행하면 된다.nohup java -jar project_name.jar
java
를 실행할 수 있도록 맞는 버전의 java jdk를 설치해야한다.FROM openjdk:17-jdk
ARG JAR_FILE=build/libs/proejct_name-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} /proejct_name.jar
ENTRYPOINT ["sh", "-c", "java -jar -Dspring.profiles.active=prod /proejct_name.jar > /logs/application.log 2>&1"]
> /logs/application.log
는 출력을 /logs/application.log
에 저장하겠다는 의미이며, 실행 중에 발생하는 메세지가 파일에 기록된다2>&1
의 의미는 다음과 같다.2>
는 에러의 리다이렉션,&1
는 출력의 파일 디스크립터의 참조sh - c
는 sh
명령어로 뒤에 오는 문자열을 명령어로 실행하도록 지시한다."java -jar -Dspring.profiles.active=prod /proejct_name.jar > /logs/application.log 2>&1"
라는 복합 명령어를 실행할 수 있도록 하는 명령으로 이해하였다.Dockerfile
로 도커 이미지를 실행하였더니 /logs/application.log
파일에는 아무것도 기록되지 않았다./logs
폴더에 다음과 같이 권한을 수정하였지만 바뀌는건 없었다.chmod -R 777 /logs
docker logs --option [container id || container name]
Option | Default | Description |
---|---|---|
--details | 디테일한 추가 로그를 제공 | |
-f, --follow | 실시간 로그를 보여줌 | |
--since | 특정 시간 이후의 로그를 보여줌 | |
-n, --tail | all | 끝에서부터 n개의 로그를 보여줌 |
-t, --timestamps | 각 로그 앞에 타임스탬프를 보여줌 (Spring Boot에서는 필요 X) | |
--until | 특정 시간 이전의 로그를 보여줌 |
docker logs --details <container>
docker logs -f <container>
docker logs --since="1h" <container>
docker logs --since="2024-11-24T11:12:00Z" <container>
docker logs -n 100 <container>
docker logs -t <conatiner>
docker logs --until="1h" <container>
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/project_name.jar"]
nohup
을 붙이지 않아도 된다.docker run --name=project_name -d -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/project_name:latest
-d
를 붙여야 한다.docker logs <container>
를 통해 쉽게 로그 확인이 가능해졌다.