티스토리 뷰

Docker 와 Container

Dockerfile - SCRATCH

looeon 2024. 3. 5. 17:11

○ 최대한 작게 image 를 만드려면 scratch 를 사용한다

# scratch 이미지는 내부에 아무 내용도 없다

# 따라서 /tmp 등 아무것도 없으며 무조건 / ( 루트 밑으로만 설정 가능하다 )

# 컨테이너 안에 들어갈 수 없다

 

 

동적 컴파일

 

▷ hello.c 생성 ( C 언어 기반으로 만들었다 )

#include <stdio.h>
int main()
{
        printf("hhhhhh container \n");
        return 0;
}

 

 

▷ 컴파일러를 해줘야 한다

[vagrant@docker1 src]$ sudo yum -y install gcc
[vagrant@docker1 src]$ gcc -o hello hello.c

# - o : output

[vagrant@docker1 src]$ ./hello
hhhhhh container

 

 

▷ Dockfile 생성

# CMD /hello >> /bin/sh -c /hello 라고 출력되므로 잘못됐다

# 단독으로 처리되어야 한다

FROM scratch
COPY src/hello /
CMD ["/hello"]
[vagrant@docker1 work]$ docker build -t hello .

 

○ 실행이 안된다

[vagrant@docker1 work]$ docker run hello
exec /hello: no such file or directory

 

▷ Host 는 커널만 같이 쓸 뿐, 컨테이너 안에 있는 라이브러리가 없으므로 찾지 못했다

# Host 는 라이브러리 파일이 존재한다

 

[vagrant@docker1 work]$ ldd src/hello
        linux-vdso.so.1 =>  (0x00007ffe7a1a1000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f6ff789d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6ff7c6b000)

 

 

▷ Host 의 라이브러리 파일을 복사해주면 된다

>> 첫번째는 vdso >> 가상으로 존재하므로 복사할 필요가 없다

>> 똑같은 lib64 디렉터리 만들어줘야 한다

[vagrant@docker1 work]$ mkdir lib64

[vagrant@docker1 work]$ cp /lib64/libc.so.6 lib64

[vagrant@docker1 work]$ cp /lib64/ld-linux-x86-64.so.2 lib64

[vagrant@docker1 work]$ ls lib64/
ld-linux-x86-64.so.2  libc.so.6

 

 

▷ Dockerfile 에 내용 추가 하여 다시 빌드

FROM scratch
COPY src/hello /
COPY lib64 /lib64
CMD ["/hello"]
[vagrant@docker1 work]$ docker run hello
hhhhhh container

 

 

 

# scratch 는 다운로드가 불가능하다 그저 예약된 내용일 뿐이다

[vagrant@docker1 work]$ docker pull scratch
Using default tag: latest
Error response from daemon: 'scratch' is a reserved name

 

 

[ 정적 컴파일 ]
바이너리 파일 안에 라이브러리 파일을 넣어서
더 간편하게 실행방법

 

 

※ 필요한 모든 라이브러리 파일을 모두 넣어주는 것

[ 더 작고 간편하게 만들어 질 수 있다 ]

 

[vagrant@docker1 src]$ gcc -static -o hello hello.c
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

 

▷ 정적 컴파일을 위한 패키지

[vagrant@docker1 src]$ sudo yum install -y glibc-static

 

○ hello 가 hello_dynamic 보다 더 크기가 크다

>> 라이브러리 파일이 모두 들어가있다

 

[vagrant@docker1 src]$ ll

-rwxrwxr-x. 1 vagrant vagrant 861288 Mar  5 17:06 hello
-rw-rw-r--. 1 vagrant vagrant     77 Mar  5 16:52 hello.c
-rwxrwxr-x. 1 vagrant vagrant   8360 Mar  5 16:52 hello_dynamic

 

▷라이브러리 파일이 hello_dynamic 에 들어가있다

[vagrant@docker1 src]$ ldd hello
        not a dynamic executable
[vagrant@docker1 src]$ ldd hello_dynamic
        linux-vdso.so.1 =>  (0x00007fff8f3ad000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fe3c66c7000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe3c6a95000)

 

▷Dockerfile 수정

FROM scratch
COPY src/hello /
CMD ["/hello"]

 

 

▷다른 이름으로 이미지 생성

[vagrant@docker1 work]$ docker build -t new-hello .

 

 

 

▷ 이미지의 크기가 더 작아졌다

[vagrant@docker1 work]$ docker image ls hello
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
hello        latest    7b7eac1184f7   8 minutes ago   2.33MB
[vagrant@docker1 work]$ docker image ls new-hello
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
new-hello    latest    fe6927e6bcc9   25 seconds ago   861kB

 

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

LAB1  (0) 2024.03.05
Dockerfile - Multi-stage build  (0) 2024.03.05
Dockerfile - ONBUILD  (0) 2024.03.05
Dockerfile - ARG / COPY / VOLUME  (0) 2024.03.05
Docker image 가 만들어지는 과정  (0) 2024.03.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
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
글 보관함