ARM서버용 Spring Boot Dockerfile (Dokku)

필자는 2개의 서버를 돌리고 있다. 하나는 잡탕구리 서버이고, 나머지 하나는 서비스 전용 서버이다. 원래는 잡탕구리 서버에서 모든걸 다 돌렸었다. 그러다가 dokku에 정착하면서 조금 달라졌다. 필자가 처음 Dokku를 쓸 때만 해도 ARMv8을 제대로 지원하지 못했다. 그래서 AMD64용 서버를 하나 더 돌려 사용했다.

서버를 두개씩 돌리니까 서버비가 꽤 나오기 시작했다. 사실 이전에는 부담이 아니었는데, 환율이 오르니까 앞자리가 달라졌다; 그래서 ARM 서버에 dokku를 올리기로 했다. 조금의 삽질이 있었는데 여기서 짧게 정리를 한다.

혹시나 cannot execute binary file: Exec format error 와 같은 에러를 만났다면 이것을 적용해도 된다.
해당 메세지는 대부분 CPU 아키텍쳐가 달라서 실행하지 못할 때 발생하는 오류이다. (파일 자체가 손상되지 않았다면)

핵심 내용

ARM 계열에서는 herokuish 빌드팩을 쓰지 않는다. 대신 Cloud Native Pack 또는 Docker를 사용한다. 만약 그냥 push(build)를 걸었다면 Pack이 빌드를 진행할 것이다. 이 글에서는 Dockerfile로 빌드를 진행한다. 혹시나 Docker로 간단한 Spring Boot를 띄울 생각이라면 참고해도 좋을것 같다.

루트 디렉토리에 Dockerfile 파일을 만든다. (만들지 않으면 pack이 빌더로 사용된다.)

FROM arm64v8/openjdk:17-jdk

# gradle을 실행하기 위해서는 findutils 필요
RUN microdnf install findutils

WORKDIR /app
COPY . .
RUN ./gradlew bootjar

RUN cp ./build/libs/*.jar /app/web.jar

# Default environment variables
ENV PORT=5000
ENV JAVA_OPTS=""

# Start the application with dynamic runtime arguments
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Dserver.port=$PORT -jar /app/web.jar"]

그리고 Timezone을 설정한다.

dokku config:set krnis-sam "JAVA_OPTS=-Duser.timezone=Asia/Seoul"

그 외, init 설정 같은것은 할 필요 없다.

이렇게만 설정하면 알아서 Dockerfile 빌드를 한다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

최신 글