$ docker run ubuntu
위 명령어를 실행하면 바로 종료된다.
ubuntu 이미지의 Dockerfile을 살펴보면
CMD로 bash 를 사용하는걸 볼 수 있다.
bash는 터미널에서 입력을 수신하는 셀인데
터미널을 찾을 수 없으면 종료한다.
docker는 기본적으로 실행될 때 컨테이너에 터미널을 연결하지 않는다.
그래서 bash 프로그램은 터미널을 찾지 못하고 종료되는것이다.
1. 컨테이너를 시작하기 위한 다른 명령어는 어떻게 지정할 수 있을까?
한 가지 옵션은 docker run 뒤에 명령어는 추가하는 것이다.
$ docker run ubuntu sleep 5
위와 같이 sleep 5 명령어를 추가하면
컨테이너가 시작될 때 sleep 프로그램을 실행하고 5초 후에 종료된다.
2. 어떻게 하면 이 변경 사항을 영구적으로 만들 수 있을까?
이미지가 시작될 때 항상 sleep 명령어를 실행하고 싶다면
위 Dockerfile과 같이
기본 Ubuntu 이미지에서 고유한 이미지를 만들고
새 명령어를 지정하면 된다.
명령어를 지정하는 방식에는
셸 형식 그대로 sleep 5를 사용하거나
오른쪽과 같이 JSON 배열 형식으로 사용할 수 있다.
JSON 배열 형식으로 지정할 때
배열의 첫 번째 요소는 실행 파일이어야한다는 점이다.
위 예시에서 실행 파일은 sleep 프로그램이 된다.
$ docker build . -t sleep-ubuntu
$ docker run sleep-ubuntu
위 Dockerfile을 빌드해서 새로운 이미지를 만들고 실행해 보면
$ docker run ubuntu sleep 5 와 동일한 결과를 얻을 수 있다.
그런데 여기서 추가적으로
3. sleep의 시간(초)를 변경하려면 어떻게 해야할까?
현재 sleep 5초로 하드코딩 되어 있다.
제일 간단한 방법은 그 위에 sleep 10 명령어로 덮어 씌우는 것이다.
$ docker run sleep-ubuntu sleep 10
하지만 sleep 단어가 중복이 되어 별로 좋아 보이지는 않는다.
sleep-ubuntu 이미지의 이름이 그 자체로 sleep 한다는 것을 의미하고 있다
아래와 같이 뒤에 시간만 전달하면 좋을 것 같은데
$ docker run sleep-ubuntu 10
이 때 사용되는것이 ENTRYPOINT 이다.
ENTRYPOINT는 CMD 와 비슷하게
컨테이너가 시작될 때 실행할 프로그램을 지정할 수 있다.
그래서 명령줄에서 지정하는 모든 항목이 ENTRYPOINT에 추가된다.
위 예시에서는 명령줄에서 지정한 '10'이
ENTRYPOINT인 sleep의 뒤에 추가되어
sleep 10 의 명령어가 컨테이너가 시작할때 실행된다.
하지만 위와 같이 ENTRYPOINT로 만든 이미지를
$ docker run sleep-ubuntu
뒤에 시간을 추가하지 않고 실행하면 오류가 발생한다.
4. 명령줄에 값이 지정되지 않았을 때 기본값을 어떻게 설정하면될까?
여기서 CMD와 ENTRYPOINT를 모두 활용하면 된다.
CMD 를 설정해 두면
명령줄에 매개변수가 지정되지 않았을 경우 '5'가 기본값으로 들어가
sleep 5가 된다.
반대로 명령줄에 매개변수를 지정했을 경우
$ docker run sleep-ubuntu 10
CMD가 무시되고 지정한 10이 들어가 sleep 10이 된다.
그러려면 항상 JSON형식으로 ENTRYPOINT와 CMD 로 지정해야한다.
'IT > 도커' 카테고리의 다른 글
8. docker registry (0) | 2023.01.25 |
---|---|
7. docker compose (0) | 2023.01.25 |
5. 도커 환경변수 (0) | 2023.01.22 |
4. 도커 이미지 생성, 푸쉬 (0) | 2023.01.21 |
3. 도커 실행 관련(태그, 포트, 볼륨 매핑 등) (0) | 2023.01.19 |