Dockerfile: CMD로 여러 명령어 수행하기
Dockerfile에서 CMD를 통해 여러 개의 명령어를 수행하고싶어졌다.
내가 알아낸 방법은 2개이다.
방법 1
.sh file을 만들어서 활용하는 것이다.
start.sh
#!/bin/sh
cd installcert
ls
mkdir testdir
java -jar /app.jar
위와 같이 start.sh를 만들었다고 하자!
이제 Dockerfile에서 이 start.sh를 사용하도록 설정만 하면 된다.
주의할 점은 맨 윗부분에 적어놓은 #!/bin/sh라는 명령어이다.
이 부분은 내가 사용하는 image에 따라 다를 수 있다.
#!shell path를 입력하면 되는데, echo $0 명령어로 sehll path를 확인할 수 있다.
Dockerfile
FROM openjdk:14-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
COPY installcert/* installcert/
ADD start.sh /
RUN chmod +x /start.sh
CMD ["/start.sh"]
중요한 부분은 ADD와 RUN, CMD 지시어이다.
ADD start.sh /를 통해서 만들어둔 start.sh를 / 경로에 복사한다.
그리고 RUN chmod +x /start.sh 명령어를 통해 start.sh file에 대한 권한을 설정한다.
해당 권한을 부여하지 않으면 이 start.sh file을 실행할 수 없다.
마지막으로 CMD ["/start.sh"] 명령어를 통해 start.sh file을 실행하면
start.sh에 적어놓은 명령어들이 잘 실행되는 것을 확인할 수 있다.
방법 2
방법 2는 docker-compose.yml의 command option을 사용하는 것이다.
(물론 당연히 docker run을 통해 command option을 사용해도 된다.)
참고로 command option을 지정하면 Dockerfile의 CMD 지시어를 덮어쓰게 되니 주의할 필요가 있다!
Dockerfile
FROM openjdk:14-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
COPY installcert/* installcert/
docker-compose.yml에 명령어를 직접 적을 것이기때문에
Dockerfile에 있던 start.sh 관련 지시어들은 모두 제거했다.
docker-compose.yml
version: '3.9'
services:
refill_arduino:
image: refill_arduino
ports:
- "8081:8081"
volumes:
- ./ext:/ext
command: sh -c "cd installcert && ls && mkdir testdir && java -jar app.jar"
docker-compoes.yml에 실행하고싶은 명령어들을 위와 같이 &&로 묶어서 지정해주면 된다.
이제 docker compose up -d 명령어를 실행해보면 여러 명령어들이 잘 실행되는 것을 볼 수 있다.