Search

Dockerfile을 통해 Build하기

생성일
2025/03/06 08:57
태그
AI 요약
날짜
상위 항목
하위 항목

Dockerfile이란?

Docker에서 ImageBuild하고 Container를 생성하면 우리는 해당 Container 에 필요한 라이브러리들을 설치하게 된다. 이미지 종류에 따라 내장되어있는 라이브러리가 다르기 때문에 설치해야하는 라이브러리도 매 번 다르다.
나의 경우에도 컨테이너를 생성하고나면 항상 하는 일이 있다.
apt-get update && apt-get upgrade -y apt-get install -y sudo vim net-tools ssh openssh-server curl apt-get install -y --no-install-recommends git
Plain Text
복사
docker에서 제공하는 Dockerfile을 사용하면 반복되는 작업을 image 빌드단계에서 미리 설정해둘 수 있다.
위 명령어를 자동화하기 위해서는 아래와 같이 Dockerfile을 작성해준다.

Dockerfile 작성

# 사용하고자하는 소스 이미지명 FROM ubuntu:20.04 # 필수 라이브러리 설치 RUN apt-get update && apt-get upgrade -y RUN apt-get install -y sudo vim net-tools ssh openssh-server curl RUN apt-get install -y --no-install-recommends git
Plain Text
복사
Dockerfile을 작성하면 그 경로로 이동 후 아래 명령어를 입력하면 이미지가 생성되어 있고
dominic@Mac-Studio % docker build . dominic@Mac-Studio % docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 5711801e8649 0 days ago 1.75GB
Plain Text
복사
실제로 컨테이너를 생성하고 접속해보면 위의 명령어로 이미 라이브러리들이 설치된 것도 확인 할 수 있다.
이와 같이 예시는 굉장히 간략하게 작성했지만 Dockerfile은 굉장히 많은 명령어를 입력할 수있다.

docker build 명령어

명령어
설명
예시
docker build [옵션] 경로
지정된 경로의 Dockerfile을 사용하여 이미지를 빌드합니다.
docker build .
-t, --tag 이름:태그
빌드된 이미지에 이름과 태그를 지정합니다.
docker build -t my-image:1.0 .
-f, --file Dockerfile경로
사용할 Dockerfile의 경로를 지정합니다.
docker build -f my-dockerfile .
--build-arg 변수=값
Dockerfile 내에서 ARG 명령어를 통해 정의된 빌드 인자에 값을 전달합니다.
docker build --build-arg VERSION=1.0 .
--no-cache
이미지 빌드 시 캐시를 사용하지 않고 항상 새롭게 빌드합니다.
docker build --no-cache .
--target 스테이지이름
멀티 스테이지 빌드에서 특정 스테이지를 대상으로 이미지를 빌드합니다.
docker build --target builder .
--pull
빌드 과정에서 필요한 베이스 이미지를 항상 최신 버전으로 다운로드합니다.
docker build --pull .
-q, --quiet
빌드 과정의 상세 출력을 생략하고 이미지 ID만 출력합니다.
docker build -q .

dockerfile 명령어

명령어
설명
예시
FROM 이미지:태그
베이스 이미지를 지정합니다.
FROM ubuntu:latest
RUN 명령어
이미지 빌드 시 컨테이너 내부에서 명령어를 실행합니다.
RUN apt-get update && apt-get install -y python3
COPY 원본경로 대상경로
호스트 파일 시스템의 파일을 이미지 내부로 복사합니다.
COPY . /app
ADD 원본경로 대상경로
COPY와 유사하지만 URL로부터 파일을 다운로드하거나 압축 파일을 풀 수 있습니다.
ADD https://example.com/myfile.tar.gz /app
WORKDIR 경로
컨테이너 내부의 작업 디렉토리를 설정합니다.
WORKDIR /app
ENV 변수 값
환경 변수를 설정합니다.
ENV MY_VAR="my value"
EXPOSE 포트
컨테이너가 외부로 공개할 포트를 지정합니다.
EXPOSE 8080
CMD ["실행파일", "인자1", "인자2"]
컨테이너가 시작될 때 실행할 기본 명령어를 지정합니다.
CMD ["python3", "app.py"]
ENTRYPOINT ["실행파일", "인자1", "인자2"]
컨테이너가 시작될 때 항상 실행할 명령어를 지정합니다.
ENTRYPOINT ["/usr/bin/nginx"]
VOLUME 경로
호스트와 컨테이너 간 볼륨을 공유합니다.
VOLUME /data
ARG 변수[=기본값]
빌드 인자를 정의합니다.
ARG VERSION=1.0
LABEL 키=값
이미지에 메타데이터를 추가합니다.
LABEL maintainer="john.doe@example.com"
위 명령어를 활용하여 현재 진행중인 프로젝트에 필요한 Image를 생성하고 CI/CD Pipeline에 활용해보려한다.
FROM ubuntu:20.04 # ---------------------------------------------------- # # SET ENVIROMENT # # ---------------------------------------------------- # ENV USER websvr # ---------------------------------------------------- # # SET ARGUMENT TO BUIDL # # ---------------------------------------------------- # ARG GITHUB_REPOSITORY=git@github.com:doominkim/chzzk-cheese.git ARG GITHUB_REPOSITORY_NAME=chzzk-cheese # ---------------------------------------------------- # # PACAKGE INSTALL # # ---------------------------------------------------- # # 필수 라이브러리 설치 RUN apt-get update && apt-get upgrade -y RUN apt-get install -y sudo vim net-tools ssh openssh-server curl RUN apt-get install -y --no-install-recommends git RUN apt-get install -y --no-install-recommends \ python3 python3-pip ffmpeg && \ rm -rf /var/lib/apt/lists/* # Python 패키지 의존성 설치 및 pip 업그레이드 RUN pip3 install --upgrade pip # Whisper 설치 RUN pip3 install git+https://github.com/openai/whisper.git RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash \ && export NVM_DIR="$HOME/.nvm" \ && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" \ && nvm install 22 \ && npm install -g pm2 \ && export PATH=$PATH:/root/.npm-packages/bin # ---------------------------------------------------- # # ADD SSH-KEY TO CONNET GIT # # ---------------------------------------------------- # # add sshkey ADD kimduumin-GitHub /root/.ssh/id_rsa RUN chmod 600 /root/.ssh/id_rsa RUN ssh-keyscan github.com >> /root/.ssh/known_hosts # ---------------------------------------------------- # # TERMINAL SETTING # # ---------------------------------------------------- # # Access Option RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config RUN sed -i 's/UsePAM yes/#UserPAM yes/g' /etc/ssh/sshd_config RUN git config --global user.name "doominkim" && \ git config --global user.name "kimduumin@gmail.com" #user add & set RUN groupadd -g 999 $USER RUN useradd -m -r -u 999 -g $USER $USER # 유저에 sudoers 권한부여 RUN sed -ri '20a'$USER' ALL=(ALL) NOPASSWD:ALL' /etc/sudoers #set root & user passwd RUN echo 'root:root' | chpasswd RUN echo $USER':gumdong1!530' | chpasswd # ---------------------------------------------------- # # SET WEB SERVER # # ---------------------------------------------------- # WORKDIR /home/$USER RUN mkdir app WORKDIR app RUN git clone $GITHUB_REPOSITORY $GITHUB_REPOSITORY_NAME WORKDIR $GITHUB_REPOSITORY_NAME # RUN nvm install 22 RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash \ && export NVM_DIR="$HOME/.nvm" \ && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" \ && nvm install 22 \ && npm install -g pm2 # ENTRYPOINT pm2 start ENTRYPOINT sudo service ssh restart && bash # 서비스 PORT 명시 EXPOSE 3000 EXPOSE 3022 USER root
Plain Text
복사
dominic@Mac-Studio % docker build -t my-web-server:0.1 -q . dominic@Mac-Studio % docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE my-web-server 0.1 5711801e8649 5 days ago 1.75GB dominic@Mac-Studio % docker run -it my-web-server:0.1 -p 3022:22 3000:3000
Plain Text
복사