Dockerfile이란?
Docker에서 Image를 Build하고 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
복사