본문 바로가기

오류일기

Dockerfile, Docker-compose에서 CMD 여러개 입력하기

개인적으로 하고 있는 프로젝트에서 도커를 이용해 가상 환경을 띄워야 하는 상황이 발생했습니다. 그리고 해당 이미지를 띄우자 마자 사용해야 하는 명령어가 두 개 있었습니다.

  1. 하나는 redis를 띄우는 것이고
  2. 나머지 하나는 jar파일을 실행시키는 것이였습니다.

저는 도커 문법에 어색했지만 금방해낼거라 생각하고 작업을 진행하였으나... 문제가 발생하고 해결까기 5시간 걸렸습니다... ㅠㅠ

 

이렇게 오래 걸릴줄은 몰랐어여...

시행착오

일단 제가 작성했던(안돌아가던) 도커 파일은 다음과 같습니다.

FROM sami355/performance-test:latest

WORKDIR /app

COPY ./build/libs/Login-0.0.1-SNAPSHOT.jar /app/interceptor.jar

CMD ["redis-server", "java", "-jar", "interceptor.jar", "--spring.profiles.active=interceptor"]

 

그리고 이것을 빌드해 컨테이너로 만들면 다음과 같은 로그를 뱉습니다...

 

진짜 울고 싶었습니다....

 

1:C 06 Apr 2024 12:50:11.987 # Fatal error, can't open config file '/app/java': No such file or directory

 

 

 

이에 대한 해결책을 오랜시간 찾다 어떠한 분의 블로그를 보았습니다.(그저 빛...)

https://binux.tistory.com/76

 

[Docker] docker-compose 에서 multiple commands 를 사용하는 법

이번 글은 기본이 부족해 삽질한 경험이 바탕이 되는 글입니다. 🥲 docker-compose에서 multiple commands를 사용하는 법에 대해 알아보겠습니다 😸 docker-compose 에서 multiple commands 가 왜 필요해 ? 아래와

binux.tistory.com

그리고 해당 글에서는 docker-compose를 이용해 글을 작성하였으나 저의 경우 docker file이였기에 문법이 조금은 달랐습니다.

핵심은 다음과 같습니다.

 

sh -c
cmd1 & cmd2

 

먼저 sh키워드로 쉘 스크립트를 수행한다고 컴퓨터에게 알려준뒤 -c로 이후로는 수행해야 하는 명령어를 나열합니다.

또한 핵심은 쉘에서는 서로 다른 두 개의 명령어 사이 &&를 이용해 구분해주는 것이였으나 도커 파일에서는 &로 구분합니다.

 

그리하여 두개 이상의 CMD 명령어를 지닌 docker file은 다음과 같습니다.

FROM sami355/performance-test:latest

WORKDIR /app

COPY ./build/libs/Login-0.0.1-SNAPSHOT.jar /app/interceptor.jar

ENTRYPOINT ["sh", "-c"]
CMD ["redis-server & java -jar interceptor.jar --spring.profiles.active=interceptor"]