Mendix 라는 물건이 참으로 오묘할때가 있는데 컴파일과 운영을 할때인거 같다.
Java 기반으로 돌아가는 물건인건 확실한데, J2EE 스펙을 기반으로 한게 아닌 M2EE 라는 본인회사에서 만든 특별한 환경에서 돌아가는걸로 되어있다.
그래서 실행파일도, mpk, mpr, mda 등의 특화된 파일이 존재한다.
물론 열어보면 그렇게 특별한게 있는건 아니다 --;;
어찌됐든 프로그램의 배포의 과정을 정리하면,
1. Mendix Studio Pro 에서 mpk 추출 ( zip 파일 )
2. mpk unzip -> 소스형태 ( mpr 프로젝트 메타파일 및 java action 등은 .java 파일로 존재 )
3. mxbuild 를 이용해서 컴파일 -> mda 파일
4. mendix-runtime 환경에서 m2ee-tools 을 이용해 mda 파일 unpack -> data/model 구조로 풀림
( 프로젝트 형태하고는 또 다름 )
5. mendix-runtime 에서 m2ee-tools 로 start 해서 프로그램 기동
이 된다.
그래서 1,2,3 을 실행하는 mxbuild 포함 컨테이너 1개와 4,5 가 가능한 mendix-runtime 컨테이너를 만들어서 운영 예정이다.
1,2,3 을 하는 컨테이너 이미지 생성 Dockerfile 이다. Mendix Studio Pro 10.12.0 를 기본으로 해서 JDK21 환경을 베이스로 하는 이미지를 깔고 시작한다.
필요한 mxbuild 파일은 https://cdn.mendix.com/runtime/mxbuild-{mxversion}.tar.gz 로 받을 수 있다.
FROM eclipse-temurin:21
RUN apt update
RUN apt upgrade -y
RUN apt install -y libicu-dev
RUN apt install -y unzip
RUN mkdir /App
COPY mxbuild-10.12.0.38909 /App/mxbuild-10.12.0.38909
RUN mkdir /App/mxbuild-10.12.0.38909/package
RUN mkdir /App/mxbuild-10.12.0.38909/log
RUN mkdir /App/mpk
그리고 4,5 컨테이너는 m2ee-tools 가 설치가능한 debian:12 를 이용해서 생성했다.
m2ee 가 설치된 이미지를 만들고 여기에 jre 와 mendix-runtime 을 설치해서 완성 한다.
# kjb-m2ee
FROM debian:12
RUN apt update
RUN apt install gnupg gnupg2 gnupg1 wget -y
RUN echo "deb http://packages.mendix.com/platform/debian/ bookworm main contrib non-free" >> /etc/apt/sources.list
RUN wget -q -O - https://packages.mendix.com/mendix-debian-archive-key.asc | apt-key add -
RUN apt update
RUN apt install m2ee-tools -y
FROM kjb-m2ee:0.1
RUN mkdir -p /App/mendix-10.12.0.38909/runtimes
COPY mendix-10.12.0.38909.tar.gz /App/mendix-10.12.0.38909/runtimes
WORKDIR /App/mendix-10.12.0.38909/runtimes
RUN tar xvzf mendix-10.12.0.38909.tar.gz
RUN mkdir -p /App/mendix-10.12.0.38909/data/model-upload
RUN mkdir -p /App/mendix-10.12.0.38909/data/files
RUN mkdir -p /App/mendix-10.12.0.38909/data/tmp
RUN mkdir -p /App/mendix-10.12.0.38909/data/database
RUN mkdir -p /App/mendix-10.12.0.38909/jre
COPY OpenJDK21U-jre_x64_linux_hotspot_21.0.3_9.tar.gz /App/mendix-10.12.0.38909/jre/
WORKDIR /App/mendix-10.12.0.38909/jre/
RUN tar xvzf OpenJDK21U-jre_x64_linux_hotspot_21.0.3_9.tar.gz
ENV JAVA_HOME=/App/mendix-10.12.0.38909/jre/jdk-21.0.3+9-jre
ENV PATH="$JAVA_HOME/bin:$PATH"
WORKDIR /App/
완성이다! 그럼 2개의 컨테이너와 배포할 mpk 그리고 설정파일이 포함된 m2ee.yaml 이 있다면,
mendix 프로그램 app 을 만드는 Dockerfile 이다.
( 위의 이미지들은 docker hub 에 올려놔서 이를 활용하게 설정한 파일이다. )
FROM gauguin135/kjb-mxbuild-10.12.0.38909:0.3 AS mxbuilder
ARG PRJ_NAME=MendixCommunity
## compile mpk -> mda
COPY ${PRJ_NAME}.mpk /App/mpk/
WORKDIR /App/mpk/
RUN unzip ${PRJ_NAME}.mpk
RUN /App/mxbuild-10.12.0.38909/modeler/mxbuild --target=package --output="/App/mxbuild-10.12.0.38909/package/${PRJ_NAME}.mda" "/App/mpk/${PRJ_NAME}.mpr" --write-errors="/App/mxbuild-10.12.0.38909/log/${PRJ_NAME}-Build.log" --java-home="/opt/java/openjdk" --java-exe-path="/opt/java/openjdk/bin/java"
FROM gauguin135/kjb-mendix-10.12.0.38909:0.2
## ARG 한번더 선언해줘야함
ARG PRJ_NAME=MendixCommunity
COPY --from=mxbuilder /App/mxbuild-10.12.0.38909/package/${PRJ_NAME}.mda /App/mendix-10.12.0.38909/data/model-upload/
COPY m2ee.yaml /App/
## 프로젝트에 따른 로그폴더 생성
RUN mkdir -p /App/log
RUN m2ee unpack ${PRJ_NAME}.mda -c /App/m2ee.yaml -y
WORKDIR /App/
그럼 해당 이미지를 실행하고, 접속해서 m2ee start 까지 실행하면 구동이 완료된다!
docker build --tag kjb-mendix-mendixcommunity:0.1 .
docker run -it -d --name kjb-mendix-mendixcommunity -p 8000:8000 kjb-mendix-mendixcommunity:0.1 bash
docker exec -it kjb-mendix-mendixcommunity /bin/bash
## 컨테이너 안에서 실행
m2ee start -c /App/m2ee.yaml
완료!