제목은 어그로이고 정확하게 말하면 CMD 명령어를 여러번 사용은 불가능합니다.
Docker에서 ENTRYPOINT 명령이나 CMD 명령은 1번만 사용이 가능한 걸 아실겁니다.
하지만 CMD 명령을 여러번해야하는경우가 분명히 생기죠...ㅡㅡ
이럴때는 명령어를 모아놓은 sh 파일을 만들고 해당 sh 파일을 CMD로 실행하면 됩니다!
예제를 보시겠습니다.
- start.sh 파일
#!/bin/bash
# dkron background로 시작
/usr/bin/dkron agent --server --bootstrap-expect=1 --node-name=node1 &
# dkron 시작대기시간
sleep 10s
# dkron jobs restore
curl http://localhost:8080/v1/restore --form 'file=@dkron_job_backup.json'
## container 종료방지를 위한 무한 loop
while true;
do echo "still live";
sleep 600;
done
dkron이라는 cron 프로그램을 &(백그라운드)로 실행하고,
dkron daemon이 실행되는데 10s를 기다린후에...
curl 명령어로 cron job을 복구한다음,
무한 loop를 발생시켜, 도커 Container의 종료를 방지합니다.
도커 Container는 쉽게 말해 어떤 특수한 명령을 계속해서 실행하는 겁니다! 명령이 종료되면 Container는 바로 종료되겠죠.
따라서 강제로 무한 loop를 발생시켜 도커 Container를 실행합니다.
- Dockerfile
# ubuntu 20.04 이미지 사용
FROM debian:latest
# 상호작용 해제
ARG DEBIAN_FRONTEND=noninteractive
# Install Package
RUN apt-get update && \
apt-get -y install wget && \
apt-get -y install curl && \
apt-get -y install vim && \
apt-get -y clean && \
apt-get -y autoremove
# dkron 설치
RUN wget https://github.com/distribworks/dkron/releases/download/v3.2.0/dkron_3.2.0_linux_amd64.deb
RUN dpkg -i dkron_3.2.0_linux_amd64.deb
# dkron job 파일 및 shell script 복사
COPY start.sh /
RUN chmod +x /start.sh
# Port Mapping
EXPOSE 8080
CMD ["/start.sh", "run"]