필자는 2개의 서버를 돌리고 있다. 하나는 잡탕구리 서버이고, 나머지 하나는 서비스 전용 서버이다. 원래는 잡탕구리 서버에서 모든걸 다 돌렸었다. 그러다가 dokku에 정착하면서 조금 달라졌다. 필자가 처음 Dokku를 쓸 때만 해도 ARMv8을 제대로 지원하지 못했다. 그래서 AMD64용 서버를 하나 더 돌려 사용했다.
서버를 두개씩 돌리니까 서버비가 꽤 나오기 시작했다. 사실 이전에는 부담이 아니었는데, 환율이 오르니까 앞자리가 달라졌다; 그래서 ARM 서버에 dokku를 올리기로 했다. 조금의 삽질이 있었는데 여기서 짧게 정리를 한다.
혹시나 cannot execute binary file: Exec format error
와 같은 에러를 만났다면 이것을 적용해도 된다.
해당 메세지는 대부분 CPU 아키텍쳐가 달라서 실행하지 못할 때 발생하는 오류이다. (파일 자체가 손상되지 않았다면)
Oracle Cloud의 ARM 서버를 사용하고 있다. Block Storage 등등을 사용하고 있어서 기존에도 수만원이 나왔었다.
핵심 내용
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"]
사용할 자바 버전을 맨 위 FROM
에 잘 적용하자. 예를 들어, Java 21을 사용하려면 FROM arm64v8/openjdk:21-jdk
로 수정하면 된다. 이미지 자체는 Java 7 부터 있는것 같다.
이미지 목록은 https://hub.docker.com/r/arm64v8/openjdk/tags 을 참고하자.
그리고 Timezone을 설정한다.
dokku config:set krnis-sam "JAVA_OPTS=-Duser.timezone=Asia/Seoul"
그 외, init 설정 같은것은 할 필요 없다.
이렇게만 설정하면 알아서 Dockerfile 빌드를 한다.
답글 남기기