본문 바로가기

Docker

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를 확인할 수 있다.

 

shell 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"]

중요한 부분은 ADDRUN, 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을 지정하면 DockerfileCMD 지시어를 덮어쓰게 되니 주의할 필요가 있다!

 

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 명령어를 실행해보면 여러 명령어들이 잘 실행되는 것을 볼 수 있다.

'Docker' 카테고리의 다른 글

DOCKER Host is unreachable 해결하기  (2) 2022.10.15