티스토리 뷰

● Dockerfile : 필요없는 것을 빼고 작게 만들 수 있고, 최적화가 되어있다

[ 주로 Docker image 는 Dockerfile 로 만들어진다 ]

 

https://docs.docker.com/reference/dockerfile/

 

Dockerfile reference

Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.

docs.docker.com

# Dockerfile 명령어 참조

 

 

◆ testtfile 만들어보기

FROM [ Base image ]
# FROM 으로 시작한다
RUN [ 리눅스 명령어 ]
# 커맨드를 쓸 때 쓰는 명령어 RUN
# Host 가 아닌 docker image 에서 실행되는 명령어
# CMD 는 컨테이너 실행할 때 사용하는 명령어 ( 이미지 만들 때 쓰는 명령어가 아니다 )
# CMD [ 명령어 ]
# 그러나 1번밖에 사용 못한다 ( 여러개 사용하면 마지막 것만 실행한다 )
# ENTRYPOINT [ 명령어 ]
# ENTRYPOINT 의 셀 형식은 셀이 처리해준다 ( 셀로 처리 한다는 의미 )
# ENTRYPOINT 도 한번만 실행 ( 여러개 일 경우 마지막 것만 실행된다 )
# ENTRYPOINT exec 형식은 단독으로 처리한다

# ENTRYPOINT /bin/sleep 180s >> /bin/sh -c 로 처리 
# 셀 형식은 대괄호 없다

# EINTRYPOINT ["/bin/sleep","180s"] 








FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN slepp 3

 

▷ file 경로 + 이름 따로 / 디렉터리 경로 따로 적어서 이미지로 만든다

[vagrant@docker1 ~]$ docker build -t testimg:1.1 -f work/testfile /home/vagrant/work
[vagrant@docker1 work]$ docker build --tag testimg:1.0 -f testfile ~/work
[vagrant@docker1 work]$ docker build -t testimg:1.2 -f testfile .

[vagrant@docker1 work]$ docker image ls testimg
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
testimg      1.0       ea33c3236644   About a minute ago   204MB

 

 

▩ 실행해보는데 바로 죽었다

[vagrant@docker1 work]$ docker run -d testimg:1.0
ad6aa929f444a6b841bac2d80e35a817ec26ac5c49289e6c9938598fc1febfef
[vagrant@docker1 work]$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

 

▷ 실행하고 그냥 바로 끝났다

[vagrant@docker1 work]$ docker logs affectionate_euler

 

▶CMD 를 사용하여 계속 살려둘 수 있다

[vagrant@docker1 work]$ cat testfile
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
CMD /bin/sleep 3600s

 

▷ 그대로 명령어를 입력하면, 이미지 덮어쓰기도 가능하다

[vagrant@docker1 work]$ docker build --tag testimg:1.0 -f testfile ~/work/

 

○ container 가 살아있다

[vagrant@docker1 work]$ docker run -d testimg:1.0
720f23386270151e93bc07d48383d7e3fc886afc3bd69f14569fb6ec5fe58797
[vagrant@docker1 work]$ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS     NAMES
720f23386270   testimg:1.0   "/bin/sh -c '/bin/sl…"   3 seconds ago   Up 2 seconds             beautiful_diffie

 

 

○ - i t 를 사용하여 살려둔다

[vagrant@docker1 work]$ cat testfile
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
#CMD /bin/sleep 3600s
[vagrant@docker1 work]$ docker run -d --name centos2 -it testimg:1.0
d32c406ded577360359c06e7c0c28076c445994f3c95eaccc03c82d4ab666364
[vagrant@docker1 work]$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
d32c406ded57   testimg:1.0    "/bin/bash"              2 seconds ago   Up 1 second              centos2
720f23386270   a4a8e86ddac2   "/bin/sh -c '/bin/sl…"   2 minutes ago   Up 2 minutes             beautiful_diffie

 

 

 

○ ENTRYPOINT 셀형식으로 사용

[vagrant@docker1 work]$ cat testfile
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
#CMD /bin/sleep 3600s
ENTRYPOINT /bin/sleep 10s
[vagrant@docker1 work]$ docker build --tag testimg:1.0 -f testfile /home/vagrant/work

 

▷ /bin/sh 로 실행되어 있다

 

 

 

○ ENTRYPOINT exec 형식

FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
#CMD /bin/sleep 3600s
ENTRYPOINT /bin/sleep 180s
ENTRYPOINT ["/bin/sleep","180s"]

 

○ command 가 셀로 처리가 안되고 단독으로 처리된다

 

 

 

◇ / bin / sleep 은 실행되나 /bin/sh 로는 실행이 안된다

[vagrant@docker1 work]$ /bin/sleep 180s
^C
[vagrant@docker1 work]$ /bin/sh /bin/sleep 180s
/bin/sleep: /bin/sleep: cannot execute binary file

 

 

○ 바이너리 파일은 / bin / sh 로 처리 못하나 - c 옵션으로 처리할 수 있다

>> 리눅스의 바이너리 파일은 / bin , / sbin , / lib , / opt / bin

# c 옵션을 붙이면 whoami 로 처리해준다는 의미이다

[vagrant@docker1 work]$ /bin/sh -c whoami
vagrant
[vagrant@docker1 work]$ /bin/sh whoami
/usr/bin/whoami: /usr/bin/whoami: cannot execute binary file
[ man bash ]
-c string If  the  -c option is present, 
then commands are read from string.  
If there arearguments after the string,
they are  assigned  to  the  positional  parameters,
starting with $0.
리눅스에서는 바이너리 파일이 /bin, /sbin, /lib, /opt/bin

 

>> 이렇게는 실행이 된다

[vagrant@docker1 work]$ /bin/sh -c 'sleep "180s"'

 

▷ 마지막줄 셀 형식 추가

ENTRYPOINT ps -e | grep sh

 

>> foreground 로 제대로 잘 작동함을 확인

[vagrant@docker1 work]$ docker run --name centos5 testimg:1.0
    1 ?        00:00:00 sh

 

 

▷ exec 형식으로 바꿔본다

# 모두 따옴표로 묶어야 된다

FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
#CMD /bin/sleep 3600s
#ENTRYPOINT /bin/sleep 180s
#ENTRYPOINT ["/bin/sleep","180s"]
ENTRYPOINT ["ps","-e","|","grep","sh"]

 

>> | 나 환경변수는 셀 형식으로 처리해야 한다

>>> 커맨드를 " " 로 묶어 줘야 한다

# ex> 메타문자 리디렉션 등은 exec 형식으로 사용할 수 없다

>>> 상황에 따라 셀 형식이나 exec 형식으로 사용해야 한다

[vagrant@docker1 work]$ docker run --name centos6 testimg:1.0
error: garbage option

Usage:
 ps [options]

 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.

For more details see ps(1).

 

 

▶ ENTRYPOINT 다음에 CMD 는 사용할 수 없다 [ exec 형식 ]

FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT ["cal"]
CMD ["whoami"]

 

[vagrant@docker1 work]$ docker run --name centos7 testimg:1.0
cal: illegal year value: use 1-9999: 'whoami'

 

 

▷ cal whoami 라고 쓴 결과가 나온다

[vagrant@docker1 work]$ cal whoami
cal: illegal year value: use 1-9999: 'whoami'

 

 

▷ ENTRYPOINT 다음 오는 CMD 는 ENTRYPOINT 명령어의 인수가 CMD 에 들어가야 한다

FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT ["cal"]
CMD ["03","2024"]
[vagrant@docker1 work]$ docker run --name centos8 testimg:1.0
     March 2024
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

 

 

▩ 하지만, ENTRYPOINT 에 인수까지 다 넣은거랑 다른점

FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT ["cal","03","2024"]

 

▷ 값은 그대로이긴하다

[vagrant@docker1 work]$ docker run --name centos9 testimg:1.0
     March 2024
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

 

>> 인수 전달이 안된다 

>>> cal 03 2024 05 2025 로 입력된 것이다 ( 인수가 4개가 된다 )

[vagrant@docker1 work]$ docker run testimg:1.0 05 2024

Usage:
 cal [options] [[[day] month] year]

 

 

 

 

◆ 컨테이너를 올리면서 CMD 는 값을 덮어쓸 수 있다

>> ENTRYPOINT 와 CMD 가 같이 있으면, ENTRYPOINT 의 기본값이 CMD 가 된다

FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT ["cal"]
CMD ["03","2024"]
[vagrant@docker1 work]$ docker run testimg:1.0 05 2025
      May 2025
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

[vagrant@docker1 work]$ docker run testimg:1.0 05 2024
      May 2024
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

 

 

 

▷ 셀 형식으로  ENTRYPOINT 와 CMD 는 인수 넣어도 무시된다

FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT cal
CMD 03 2024
[vagrant@docker1 work]$ docker run testimg:1.0 05 2024
     March 2024
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[vagrant@docker1 work]$ docker run testimg:1.0 05 2026
     March 2024
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[vagrant@docker1 work]$ docker run testimg:1.0
     March 2024
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

 

 

▷ CMD 는 exec 형식으로 쓴다

FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT cal
CMD ["03","2024"]

 

### ??? 무시된다 이거 그대로뜸

>>> 강사님이 하시고 인수 바꿔서 들어간다고 했는데?

[vagrant@docker1 work]$ docker run testimg:1.0
     March 2024
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[vagrant@docker1 work]$ docker run testimg:1.0 05 2024
     March 2024
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[vagrant@docker1 work]$ docker run testimg:1.0 06 2024
     March 2024
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

 

 

 

 

 

 

'Docker 와 Container' 카테고리의 다른 글

Dockerfile - EXPOSE / WORKDIR  (0) 2024.03.05
Dockerfile - ENV / LABEL  (0) 2024.03.05
Docker container >> image / tar 만들기  (0) 2024.03.05
Docker Network  (0) 2024.03.04
Docker 의 기본  (0) 2024.03.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함