-
Dockerfile 작성 시 주요 명령어Linux 2020. 3. 20. 11:01반응형
1. FROM
어떤 이미지를 기반으로 새로운 이미지를 생성할 것인지를 나타냄
1vi Dockerfilecs Dockerfile에 아래와 같이만 작성하고 저장한다.
1docker build -t fromtest:0.0 .cs docker를 빌드한다.
-t 옵션은 이미지 이름을 정의함
뒤에 .은 Dockerfile의 위치
2. RUN
쉘에서 명령어를 입력하는 것과 같음
Dockerfile에 RUN을 작성해보자
1docker build -t runtest:0.0 .cs docker를 빌드한다.
ubuntu:18.04 이미지를 가져오고
mkdir /zerocool 을 실행하고
echo "Hello!"를 실행하는 이미지를 만들었다.
zerocool 폴더가 잘 생성되어있는것을 확인할 수 있다. 왜 echo "Hello!"는 실행되지 않는가?
RUN 명령어는 Dockerfile로부터 이미지를 만들어 낼 때에 실행되는 것이다.
즉, 이미지로 만들어 낸 다음에는 실행되지 않는다.
실제로 build 명령어 중간에는 Hello! 가 잘 출력된 것을 볼 수 있다.
3. ADD
ADD 명령어는 build 명령 중간에 호스트의 파일 시스템으로부터 파일을 가져오는 것이다.
이미지에 파일을 추가함
위와 같이 hello.txt 파일을 생성한 다음
docker file을 아래와 같이 수정함
그 후 빌드한 뒤 컨테이너를 만들어보면 파일이 추가 된 걸 확인할 수 있다.
4. ENTRYPOINT & 5. CMD
컨테이너 시작 시, 실행될 명령어를 정하는 커맨드이기에 build로 이미지가 만들어지고, 그 이미지로 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행한다.
즉 docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 실행되며ENTRYPOINT는 Dockerfile에서 단 한번만 사용할 수 있다.
사실 두 개의 명령어 CMD와 ENTRYPOINT는 컨테이너가 생성될 때 명령이 실행되는 것은 동일하지만 docker run 명령에서 동작 방식이 조금 다르다.
ENTRYPOINT 와 CMD 의 가장 큰 차이점은 바로 컨테이너 시작시 실행 명령에 대한 Default 지정 여부이다.
만약 ENTRYPOINT 를 사용하여 컨테이너 수행 명령을 정의한 경우, 해당 컨테이너가 수행될 때 반드시 ENTRYPOINT 에서 지정한 명령을 수행되도록 지정된다.
하지만, CMD를 사용하여 수행 명령을 경우에는, 컨테이너를 실행할 때 인자값을 주게 되면 Dockerfile 에 지정된 CMD 값을 대신 하여 지정한 인자값으로 변경하여 실행되게 된다.
그렇다면 ENTRYPOINT와 CMD 는 어떻게 사용하는게 좋을까.
첫째로는, 컨테이너가 수행될 때 변경되지 않을 실행 명령은 CMD 보다는 ENTRYPOINT 로 정의하는게 좋다.
컨테이너를 만들때 아마 대부분은 해당 컨테이너가 실행될 목적이 분명할 것이다.
웹서버(nginx)가 될 수도 있고, App서버(node)가 될 수도 있으며 DB(mysql) 가 될 수도 있다.
즉, 이미지를 만들때는 이러한 실행 목적이 분명하므로 nginx / node / mysql 같은 메인 프로세스가 될 명령의 경우는 ENTRYPOINT 로 정의하는게 명확할 것이다.
두번째로는, 메인 명령어가 실행시 default option 인자 값은 CMD로 정의해 주는게 좋다.
CMD 는 ENTRYPOINT 와 함께 사용시 추가 인자 값으로 활용 된다.
그러므로, 메인 프로세스에 대한 default 옵션값을 CMD 로 정의해주면 좋을 것이다.
추가로 ENTRYPOINT 와 CMD는 리스트 포맷 ( ["args1", "args2",...] )으로 정의해 주는게 좋다.
참고 : https://bluese05.tistory.com/77
http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter07/06
http://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=220646382977
반응형'Linux' 카테고리의 다른 글
Service 만들기 (0) 2020.04.17 Solving Docker permission denied while trying to connect to the Docker daemon socket (0) 2020.04.17 docker 설치 후 /var/run/docker.sock의 permission denied 발생하는 경우 (0) 2020.04.17 ubuntu root 계정 ssh 접속 설정하기 (0) 2020.04.16 Linux에서 root 계정으로 로그인하는 방법 (0) 2020.02.16