Dockerfile, Docker-compose에서 CMD 여러개 입력하기
개인적으로 하고 있는 프로젝트에서 도커를 이용해 가상 환경을 띄워야 하는 상황이 발생했습니다. 그리고 해당 이미지를 띄우자 마자 사용해야 하는 명령어가 두 개 있었습니다.
- 하나는 redis를 띄우는 것이고
- 나머지 하나는 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
이에 대한 해결책을 오랜시간 찾다 어떠한 분의 블로그를 보았습니다.(그저 빛...)
[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"]