빌드명령어로
- 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 이건 뭔가 모니터링 하는거 같은데 어따 쓰는지 아직 모르겟다
그냥 참고만하자
일단 공부는 된듯?
'42Seoul > Docker' 카테고리의 다른 글
28. docker 메뉴얼 파해치기 Build exporter (0) | 2023.03.24 |
---|---|
27. docker 메뉴얼 파해치기 Build Drivers (1) | 2023.03.24 |
25. docker 메뉴얼 파해치기 Build (0) | 2023.03.21 |
24. docker 메뉴얼 파해치기 macvlan (0) | 2023.03.20 |
23. docker 메뉴얼 파해치기 IPvlan (0) | 2023.03.20 |