42Seoul/Docker

26. docker 메뉴얼 파해치기 Build image

빌드명령어로 

- FROM

- RUN

- WORKDIR

- COPY

- CMD

 

이 대표적인거 같다 래퍼런스에 가면 훨신더 많은 명령어를 볼수 있다

예 : 환경변수 설정 볼륨. 설정 등등

https://docs.docker.com/engine/reference/builder/

 

Dockerfile reference

 

docs.docker.com

 

 

1. FROM

어떤 이미지를 사용하여 정의한것인지 설정한다

os가 뭔지 정의하는 느낌?

 

2. RUN

쉘형식[apt-get install python3]과

exec 형식[int main(int argc, char **argv <-요거?)]으로 사용할 수 있는거 같다. 

 

3. COPY

파일혹은 폴더를 복사한다 [ hello.py  / ] 현제컴퓨터에 있는 hello.py를 컨테이너 /[맨위 폴더] 에다가 넣어줌

 

4. ENV

환경변수를 추가해줌 env 나 export 명령어 했을때 정의되있는 거

 

5. EXPOSE

포트를 설정해줌

 

6. CMD

이제 만들건 다만들었으니깐 cmd 그냥 터미널에서 쓰는거랑 같은 느낌?

 

 

Build context

음.. 

예시를 따라가보자

# syntax=docker/dockerfile:1
FROM busybox
WORKDIR /src
COPY foo .


내 위치 구조
.
├── Dockerfile
├── bar
├── foo
└── node_modules

busybox를 실행하며 /src로 이동하고

거기에 foo 폴더를 복사해준다 (서로 연동된다 생각하면됨)

이런식?

그리고 github에 action을 사용하여 githup에다 도커를 만들 수 있는거 같다 하지만 내가 이해를 못햇움 ..

 

https://docs.github.com/ko/actions/creating-actions/creating-a-docker-container-action

 

Docker 컨테이너 작업 만들기 - GitHub Docs

이 가이드에서는 Docker 컨테이너 작업을 빌드하는 데 필요한 최소 단계를 보여 줍니다.

docs.github.com

 

이제 여러게의 빌드도 같이 해줄수 있다

# syntax=docker/dockerfile:1

FROM golang:1.16
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go ./
RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app ./
CMD ["./app"]

이런식으로 golang과

alpine을 두개를 한번에 만드는 것이 가능하고

명령어로는 "docker build -t 이름 . "

-t(--tag) 는 테그로 이미지 이름을 정해준다

. 은 dockerfile 있는 위치 

혹은 -f 옵션을 이용하여 빌드할 도커파일을 지정할 수 있다

 

 

또한 이름을 지정하여 좀더 변수처럼 사용할 수 있는거 같다

# syntax=docker/dockerfile:1

FROM alpine:latest AS builder
RUN apk --no-cache add build-base

FROM builder AS build1
COPY source1.cpp source.cpp
RUN g++ -o /binary source.cpp

FROM builder AS build2
COPY source2.cpp source.cpp
RUN g++ -o /binary source.cpp

이렇게 AS 를 붙이면 뭔가 이름이 되어 참신기한 일이 일어난다

alpine:latest 를 builder 로 만들어줘서

builder AS build2 는 

alpine:latest AS build2 가 된것이다

하지만 존속성 이 필요함으로 꼭 builder를 먼저 만들고 build2 가 만들어 질것이다 (뭔가 makefile 같음)

 

그리고 buildkit 라는것이 있는거 같다 이것은 무엇을 만들때 필요없는 것들은 만들지 않아주는거 같다

예를들어

# syntax=docker/dockerfile:1
FROM ubuntu AS base
RUN echo "base"

FROM base AS stage1
RUN echo "stage1"

FROM base AS stage2
RUN echo "stage2"

이러한 dockerfile이 있을때

DOCKER_BUILDKIT=1 docker build --no-cache -f Dockerfile --target stage2 .

이렇게 하면 target stage2 를 만들기 위해

base 는 만들지만 stage1은 필요없어서  만들지않는다

하지만 DOCKER_BUILDKIT=0 (끈거) 하면 stage1도 만들어버린다

 

Multi-platform 음...

참으로 햇갈린다

# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM golang:alpine AS build
ARG TARGETPLATFORM
ARG BUILDPLATFORM
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log
FROM alpine
COPY --from=build /log /log

이부분의 $BUILDPLATFORM 의 부분이다

ARG에는 값도 안넣어줫는데 나의 빌드플렛폼이 들어가있다

음.....

이런현상을 minishell만들때 경험한거 같은데

export 와 set의 느낌.. 

$BUILDPLATFORM 에는 자동적으로 할당되는 값이 있다
https://www.docker.com/blog/image-rebase-and-improved-remote-cache-support-in-new-buildkit/

 

Image rebase and improved remote cache support in new BuildKit | Docker

Learn from Docker experts to simplify and advance your app development and management with Docker. Stay up to date on Docker events and new version

www.docker.com

ARG 로 BUILDPLATFORM을 설정해주면서 내 platform 설정들을 다 가져오는거 같다 음......
그렇게 내가 설정한 많은 운영체제의 이미지가 다중으로 만들어 질 수 있다.

 

 

환경변수

이부분은 그냥 눈으로 보면 좋을거 같다 

https://docs.docker.com/build/building/env-vars/

 

Environment variables for Docker Build

 

docs.docker.com

 

open telemertry 이건 뭔가 모니터링 하는거 같은데 어따 쓰는지 아직 모르겟다

그냥 참고만하자

 

일단 공부는 된듯?