SERVER/Docker

도커 파일 생성

lovineff 2020. 6. 4. 18:06

도커 파일 생성(Dockerfile)

- 프로젝트 root 경로에 Dockerfile을 생성한다.

- Dockerfile 예제

# 실행 파일 빌드 부분
# 이미지는 openjdk 버전 8-jdk-alpine에서 실행된다.
FROM openjdk:8-jdk-alpine as TEMP_BUILD_IMAGE

# 변수 사용
ENV APP_HOME=/usr/app/

# 작업 폴더 위치 설정
WORKDIR $APP_HOME

# 실행시 필수 파일 복사
COPY gradlew $APP_HOME
COPY build.gradle $APP_HOME
COPY settings.gradle $APP_HOME
COPY gradle $APP_HOME/gradle

RUN ./gradlew -x test build || return 0

# 프로젝트 소스 폴더 복사
COPY src src

# gradlew 빌드
RUN ./gradlew bootjar

# Docker 이미지 실행
FROM openjdk:8-jdk-alpine
ENV TZ Asia/Seoul
ENV APP_HOME=/usr/app/
WORKDIR $APP_HOME

# 위에서 빌드한 파일을 test.jar 파일로 복사
COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/test.jar .

# 컨테이너는 8080 포트로 실행된다
EXPOSE 8080

# 컨테이너를 구동할 때 실행할 명령어 지정(명렁어를 스페이스로 나눈것과 같다)
ENTRYPOINT ["java","-jar","/test.jar"]

- 도커 이미지 생성

- Dockerfile이 존재하는 경로에서 아래 명령어로 빌드한다. 

# tag 명을 명시하여 빌드
sudo docker build --tag {도커_이미지명}:{버전} .


# 파일명 직접 선택 빌드 (띄어쓰기 조심)
docker build --tag test:0.2 . -f ./Dockerfile_test
docker build --tag {도커_이미지명}:{버전} . -f {Dockerfile}

 

Dockerfile 관련 작업시 주의 사항

도커 이미지 생성 전 확인 사항

 - 프로젝트의 build.gradle 파일에 아래와 같은 설정이 없다면 넣어준다.

 - 아래와 같은 설정이 없을 경우 bootJar 실행시 jar 파일명이 프로젝트 명과 함께 버전이 자동으로 붙게되어, Dockerfile 작성이 까다로워진다.

// build gradle bootJar 설정
bootJar{
    archiveFileName = 'test.jar' // 생성 파일명
    mainClassName = 'com.example.test.TestProjectApplication' // 메인 클래스 명
}

빌드 실패

- 로컬에서는 docker 파일이 정상 생성되었으나, D2hub에 자동배포 작업시 빌드 실패가 발생하는 경우가 있다.

- file not found 에러 발생시 조치 사항

  - 프로젝트에 자동 생성된 ".gitignore" 파일을 오픈하고 Dockerfile에 COPY에 명시된 내역이 작성되었는지 확인한다.

  - 작성되어 있다면 ".gitignore" 파일에서 제거한다.

 

 

Dockerfile 명령어

FROM <image>:<tag>
FROM openjdk:8-jdk
베이스 이미지 지정 (필수 값)
tag 구체적인 버전을 지정한다. (기본값 : latest)
이미지 파일은 Docker hub에서 이미지 상세 정보중 Tags 메뉴를 통해 확인 가능


MAINTAINER <name>
MAINTAINER test@abc.abc
Dockerfile을 관리하는 사람의 이름 또는 이메일 정보를 적습니다


COPY <src>... <dest>
COPY . /usr/src/app
파일이나 디렉토리를 이미지로 복사합니다. 
일반적으로 소스를 복사하는 데 사용합니다. 
target 디렉토리가 없다면 자동으로 생성됨.


ADD <src>... <dest>
ADD . /usr/src/app
COPY 명령어와 매우 유사하나 몇가지 추가 기능이 있음. 
src에 파일 대신 URL을 입력할 수 있고 src에 압축 파일을 입력하는 경우 자동으로 압축을 해제하면서 복사


RUN <command>
RUN ["executable", "param1", "param2"]
RUN ./gradlew build -x test
명령어 실행
내부적으로 /bin/sh -c 뒤에 명령어를 실행


CMD ["executable","param1","param2"]
CMD command param1 param2
CMD bundle exec ruby app.rb
도커 컨테이너가 실행되었을 때 실행되는 명령어 정의
빌드할 때는 실행되지 않으며 여러 개의 CMD가 존재할 경우 가장 마지막 CMD만 실행
한꺼번에 여러 개의 프로그램을 실행하고 싶은 경우에는 run.sh 파일을 작성하여 데몬으로 실행하거나 기타 프로그램 사용


WORKDIR /path/to/workdir
RUN, CMD, ADD, COPY등이 이루어질 기본 디렉토리를 설정
각 명령어의 현재 디렉토리는 한 줄 한 줄마다 초기화되기 때문에 RUN cd /path를 하더라도 다음 명령어에선 다시 위치가 초기화됨
같은 디렉토리에서 계속 작업하기 위해서 WORKDIR을 사용해야함


EXPOSE <port> [<port>...]
EXPOSE 8080
도커 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정 (여러개 가능)


VOLUME ["/data"]
컨테이너 외부에 파일시스템을 마운트 할 때 사용
반드시 지정하지 않아도 마운트 할 수 있지만, 기본적으로 지정하는 것이 좋습니다


ENV <key> <value>
ENV <key>=<value> ...
ENV APP_HOME=/work
컨테이너에서 사용할 환경변수를 지정
컨테이너를 실행할 때 -e옵션을 사용하면 기존 값을 오버라이딩

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dsun.net.inetaddr.ttl=0","-Duser.timezone=Asia/Seoul","-jar","testApp.jar"]
컨테이너를 구동할 때 실행할 명령어를 지정
배열내 문자열을 공백으로 변경하여 한번에 명령어를 실행한다.

 

'SERVER > Docker' 카테고리의 다른 글

도커 명령어  (0) 2020.06.04
도커란?  (0) 2020.06.04