본문 바로가기

project/홍보 사이트

[Docker file] RUN CMD ENTRYPOINT 실행 방식

Dockerfile을 통해서 홍보사이트 스프링 부터 서버를 배포하는 과정에서 ENTRYPOINT을 사용해서 어플리케이션을 실행했다.

하지만 실행한 어플리케이션의 로그를 출력한 application.log error.log 가 생성되지 않아서 로그를 확인할 수 없었다.

ENTRYPOINT ["java", "-jar", "/app/spring-webapp.jar", "1>", "/app/log/application.log", "2>", "/app/log/error.log"]

문제 원인

  • shell에 의존적인 명령사용

문제가 발생한 이유는 셀에 의존적인 명령어를 사용했지만 도커에서는 셀을 거처서 명령을 실행하는 것이 아니었다. 따라서 로그 출력하는 부분은 작동하지않고 어플리케이션만 실행된 것이었다.

이전에 막연히 []을 사용하여 명령을 실행하는 것이 좋다는 블로그 글을 보고 작동만 하는 것을 확인한 것에 비롯되었던 것...

해결

https://nomad-programmer.tistory.com/308

 

[Docker] 명령 및 데몬 실행 (RUN, CMD, ENTRYPOINT, ONBUILD)

Docker 이미지를 만들려면 필요한 미들웨어를 설치하고 사용자 계정이나 디렉토리를 작성하는 등의 명령을 실행할 필요가 있다. 또한 이미지로부터 컨테이너를 생성했을 때, 서버 프로세스 등을

nomad-programmer.tistory.com

해당 블로그의 내용을 참고하니 도커 파일에서 명령을 실행하는 방식이 두가지가 있다는 것을 알게 되었다. 그래서 공식 문서를 확인해보았다.

https://docs.docker.com/engine/reference/builder/

 

Dockerfile reference

 

docs.docker.com

공식문서에는 RUN에는 두 가지 형식이 있다고 한다.

  • RUN ( 쉘 형식, 명령은 쉘에서 실행되며 기본적으로 /bin/sh -cLinux 또는 cmd /S /CWindows에 있음)
  • RUN ["executable", "param1", "param2"] ( exec 형식)

쉘 형식을 이용하면 sh 셀을 디폴트로 사용하여 명령을 실행한다. 만얀 다른 쉘을 사용하고 싶다면 실행하고자 하는 쉘을 지정하여 사용할 수 있다.

bash셀을 사용하려면 공식 문서에서 다음 예를 소개해 주었다.

RUN /bin/bash -c 'source $HOME/.bashrc && echo $HOME'
RUN ["/bin/bash", "-c", "echo hello"]

CMD, ENTRYPOINT 역시 RUN과 같이 쉘 형식, exec 형식 두가지 방법이 있음을 소개하고 있었다.

다시 문제로 돌아와서 내가 필요한 기능은 다음과 같다.

  • 도커에서 실행한 어플리케이션의 로그를 파일에 출력하여 파일을 통해서 로그를 확인하는 기능
  • 어플리케이션 실행시 환경변수 접근 기능
    • application.yml에 보안에 위협이 되는 정보를 github에 업로드한 상태이기 때문에 이를 보완하기위해서 환경변수 설정 스크립트 파일을 만들어 실행할 때 설정한 환경변수를 통해서 어플리케이션이 실행하도록 변경할 것이기 때문에 환경변수를 명령에 입력하는 기능이 필요하다.

문제 원인에서 말했듯이 필요한 기능이 작동하지 않은 원인이 모두 쉘에 의존성이 있지만 명령어의 실행이 쉘에서 실행되지 않아서 실행된 결과였다. Dockerfile에서 실행 방식을 다음과 같이 변경하였다.

ENTRYPOINT . /app/secrets.sh >> /app/secrets.log && java -jar /app/spring-webapp.jar 1> /app/log/application.log 2> /app/log/error.log

 

기능 확인

  • 로그 파일 출력

 

  • 환경 변수를 통한 어플리케이션 실행 확인

 

'project > 홍보 사이트' 카테고리의 다른 글

프로젝트 개선하기  (0) 2023.08.30
HTTPS 적용하기  (0) 2023.02.13
CI/CD 환경구축시에 도움 받은 자료 정리  (0) 2023.02.01
Kong API gateway 사용기  (0) 2023.01.17