Membuat Docker Image Untuk Aplikasi React Native

06 Oktober 2021 - Abdul Fattah Ikhsan

Bagikan:

Dari judulnya sudah lumayan berat, setidaknya harus punya pengetahuan dasar tentang teknologi container dan linux. Tapi jangan takut, follow a long saja.

Buat yang belum tahu tentang container dan linux, bisa cari di google dengan docker atau docker container. Ya sudah banyak yang bahas di google maupun YouTube, berbeda jika kita kembali ke tahun 2014 😆.

Daftar Isi:

  1. Motivasi
  2. Alternatif
  3. Kesulitan
  4. Dockerfile
  5. CI/CD
  6. Penutup

Motivasi

di lokal komputer Saya jalan atau di komputer Saya bisa

anonim

Pernah dengar ucapan ini? pernah ya. Nah, dengan docker tidak ada lagi ucapan seperti ini.

Mempersiapkan tools untuk build React Native seperti Android, nodejs hingga environment variable sesuai kebutuhan. Semua sudah terintegrasi dalam satu wadah Docker Image.

Alternatif

Cobalah googling pasti akan ketemu official docker android untuk react native terbitan react native community. Saya baru tahu ini ketika ingin buat postingan ini 😅. Docker Image yang Saya buat ini untuk React Native versi 0.65.1.

Saya sudah buat docker image sesuai kebutuhan di project saya. Dan jika kalian coba pull image terbitan react native community dan wow fantastis! ukuran image-nya 11 GB-an cuy. Jadi, balik lagi sesuai kebutuhan.

Kesulitan

Ketika membuat ini cari-cari bahan di google dan comot sana-sini, coba dan gagal itu sudah pasti, terutama ketika awal-awal itu lama sekali build image nya sekitar satu jam-an lah di komputer Saya, karena berbanding lurus dengan koneksi internet dan kecepatan komputer. Apalagi kalau gagal karena ada yang salah, ya sudah extra 1 jam lagi 😆.

Dockerfile

Langsung saja ya isi Dockerfile-nya

FROM ubuntu:20.04
# set ARG to bypass dialog error \
# "debconf: unable to initialize frontend: Dialog \
# debconf: (TERM is not set, so the dialog frontend is not usable.) \
# debconf: falling back to frontend: Readline Configuring tzdata" \
# when installing git
ARG DEBIAN_FRONTEND=noninteractive
ARG TZ=Asia/Jakarta
ARG NODE_VERSION=14.x
ARG SDK_VERSION=7583922
ARG NDK_VERSION=21.4.7075529
ARG CMAKE_VERSION=3.10.2.4988404
ARG ANDROID_VERSION=android-31
ARG ANDROID_BUILD_TOOLS_VERSION=30.0.2

RUN apt update && apt install -y curl && \
curl -sL https://deb.nodesource.com/setup_${NODE_VERSION} | bash - && \
apt -y install gcc g++ make && \
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt update && apt -y install yarn && \
apt install -y nodejs openjdk-8-jre-headless python3
RUN apt install -y expect git openjdk-8-jdk-headless wget unzip vim && \
wget https://dl.google.com/android/repository/commandlinetools-linux-${SDK_VERSION}_latest.zip
RUN mkdir -p Android/Sdk && unzip commandlinetools-linux-${SDK_VERSION}_latest.zip -d Android/Sdk/cmdline-tools && \
mv Android/Sdk/cmdline-tools/cmdline-tools Android/Sdk/cmdline-tools/latest

ENV ANDROID_HOME="$HOME/Android/Sdk"
ENV PATH="$PATH:$ANDROID_HOME/cmdline-tools/latest"
ENV PATH="$PATH:$ANDROID_HOME/cmdline-tools/latest/bin"
ENV PATH="$PATH:$ANDROID_HOME/platform-tools"

RUN yes | sdkmanager --sdk_root=${ANDROID_HOME} "tools"
RUN sdkmanager "platform-tools" "platforms;${ANDROID_VERSION}" "build-tools;${ANDROID_BUILD_TOOLS_VERSION}"
# If you use react-native-reanimated or react-native-mmkv-storage then install ndk & cmake
RUN sdkmanager --install "ndk;${NDK_VERSION}"
RUN sdkmanager --install "cmake;${CMAKE_VERSION}"
RUN sdkmanager --licenses

CMD ["/bin/sh"]

Pahami statement kodenya ya, terutama bagian RUN nya. bandingkan dengan Image terbitan react native community diatas. Pasti ada ilmu yang di sana. Di sini tidak ada bahasan ya bagaimana cara build image dari Dockerfile.

NOTE: Sesuaikan versi di ARG statement sesuai kebutuhan, misal react native diatas versi 0.65.1 bisa jadi beda dan perlu disesuaikan.

CI/CD

Continous Integration jadi lebih mudah dan Continous Delivery jadi lebih cepat dengan menggunakan docker semua jadi otomatis. Saya Menggunakan Docker Image tersebut di Jenkins server untuk project yang sedang berjalan. Kenapa kok Saya tidak pakai Image dari react native community? Alasannya, sudah terlanjur buat 😁. Dan hasil ukuran Image-nya juga jauh lebih kecil hanya 6 GB-an (masih perlu optimasi lagi 👍). Selain bloated , project yang sedang dikerjakan tidak membutuhkan sebagian besar yang ada didalam Image dari react native community, contoh buck, watchman. Apalagi storage Jenkins yang cuma 50GB. Jenkins ini tidak hanya build react native saja, ada aplikasi lainnya, jadi mesti bagi-bagi alokasi penyimpanan.

Penutup

Dockerfile yang Saya cantumkan bisa dimodifikasi dan dioptimasi sesuai kebutuhan, juga bisa sebagai base Image. Karena kita tahu Docker Image itu berlapis-lapis (layering). Contoh, jika kalian pakai fastlane sebagai CI/CD kalian butuh bundler atau kasus lain kalian butuh buck atau watchman. Cukup buat Dockerfile lagi dengan base Dockerfile tadi. Intinya hasil Image dari Dockerfile tadi sebagai bare minimum yang bisa di extend kedepannya.

Hasil Docker Image-nya juga sudah Saya terbitkan ke docker hub pribadi. Dan Saya taruh juga di Github repository Saya.


Saya cukupkan tulisan kali ini. Terima kasih sudah membaca tulisan ini sampai selesai, Tulisan ini saya dedikasikan untuk Indonesia lebih baik. Semoga bermanfaat dan yuk lanjut kodingnya!

Apabila ada pertanyaan atau ingin kolaborasi bisa kontak langsung di telegram.

#android
#docker
#react-native
© 2021 Lanjut Koding