티스토리 뷰
○ 최대한 작게 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 |