E&K Labs
Published in

E&K Labs

JDA discord bot을 Docker로 배포하기

최근에 지금까지 개발한 웹 서비스를 Docker로 옮기는 작업을 하고 있습니다. 하지만 파이썬이 스크립트 언어임에도 불구하고 파이썬으로 개발된 애플리케이션이 제 랩탑에서 빌드 했을 때, 아키텍처 에러가 종종 발생합니다.

개발용 랩탑이 m1 맥북인 제게는 예상치 못한 치명적인 이슈인데, 심지어 디스코드 봇의 경우 제가 작성한 코드보다 라이브러리 기능이 더 많아서 프로젝트 자체를 사용할 수 없는 상황이 되기도 하였습니다. (google translation api의 grpc 관련 이슈였습니다.)

이러한 이유로 다시 개발할 필요가 있었고, 또한 JVM 언어에도 관심을 가지고 있어서 챗봇 애플리케이션을 자바 옮기기로 결정했습니다.

하지만 배포에 대한 자료가 부족하기도 하고, 자바에 대한 경험이 없다 보니 봇을 로컬에서 배포하고 Docker로 옮기는데 어려움이 많았습니다.

build.gradle 수정

제가 가장 먼저 한 작업은 build.gradle을 수정하는 것입니다.

안드로이드를 위해 gradle을 사용했을 때와 다르게 run script가 없어서 jar를 만들어야 하는데, 특정 메타데이터나 의존성 라이브러리가 없다는 이슈가 발생했습니다.

Gradle - no main manifest attribute

이 이슈 해결을 위해 jar에 대해서 특정 속성을 build.gradle에 직접 추가해 주었습니다.

tasks.jar {
manifest.attributes['Main-Class'] = 'BotEntry'
}

패키지가 없어서 클래스 이름만 덩그러니 있는데, 패키지 경로를 적으면 됩니다.

또한 의존성 클래스가 존재하지 않는다는 이슈도 발생하였습니다.

Exception in thread "main" java.lang.NoClassDefFoundError:

이에 대해서 여러 가지 방법을 찾아보았지만 배포를 하는 과정에서 가장 편한 작업은 의존성 라이브러리를 포함시키는 작업이었고, 이를 위해 shadowJar 플러그인을 이용했습니다.

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "7.1.2"
}
...tasks.jar {
finalizedBy shadowJar
manifest.attributes['Main-Class'] = 'BotEntry'
}

Jar가 많은 정보를 가지게 하고 이를 명령어로 실행하니 봇이 정상적으로 동작했습니다.

구글의 일부 기능을 사용할 때, 아래와 같은 정책 이슈가 발생하기도 하였습니다만..

Could not find policy 'pick_first'

이를 해결하기 위해 아래의 구문이 추가되었습니다.

shadowJar {
mergeServiceFiles()
}

Docker 이미지 만들기

이제 빌드와 실행이 성공했으니 다음 과정은 Docker 이미지로 빌드 하는 것입니다.

제가 사용한 Dockerfile전문입니다.

FROM gradle:7.4.2-jdk17 AS buildMAINTAINER "nv.noelvalent@gmail.com"COPY . /opt/gTranstateOnDiscord
WORKDIR /opt/gTranstateOnDiscord
RUN gradle jar --no-daemonFROM openjdk:17RUN mkdir /opt/appCOPY --from=build /opt/gTranstateOnDiscord/build/libs/gTranstateOnDiscord-1.0-SNAPSHOT-all.jar /opt/app/gTranstateOnDiscord-1.0-SNAPSHOT-all.jarENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-jar","/opt/app/gTranstateOnDiscord-1.0-SNAPSHOT-all.jar"]

Gradle 이미지로 Jar 파일을 생성하고, 이후 빌드 된 Jar 파일을 jdk 이미지로 카피한 뒤 java 명령어를 사용하여 앱을 실행했습니다.

마무리

jda가 일부 마인크래프트 PaaS 서비스에도 쓰이는 것으로 알고 있으나 이에 대한 배포 가이드를 모르기도 했고, 자바 애플리케이션 배포에 대한 경험이 없어서 조금 많이 헤맸던 것 같습니다.

이 글이 저와 같이 Docker를 이용해서 챗봇을 서비스하고 싶은 누군가에 도움이 되었으면 좋겠습니다.

--

--

우리는 아름답고 멋진 블로그 글을 작성합니다. 주 업무는 IT 에서 개발을 하며, 그 외 다양한 예술활동을 합니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store