Ubuntu 24.04 に OpenJDK と Node.js をインストールした Dockerfile を作る

Ubuntu 24.04 に OpenJDK と Node.js をインストールし、firebase-tools をグローバルインストールした Dockerfile を作るだけのことに相当の時間を溶かしたのでメモ。

nvm を使ったバージョン

まず最初に nvm を使うバージョンの完成品が下記である。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
FROM ubuntu:24.04
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 20

RUN apt-get -y update && apt-get -y install openjdk-21-jdk curl

RUN mkdir -p $NVM_DIR
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
RUN . $NVM_DIR/nvm.sh && nvm install $NODE_VERSION && nvm alias default $NODE_VERSION && nvm use default

USER ubuntu

RUN { \
    echo 'export NVM_DIR="/usr/local/nvm"'; \
    echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm'; \
    echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion'; \
} >> ~/.bashrc

RUN . $NVM_DIR/nvm.sh && npm install -g firebase-tools

WORKDIR /app

最終的には ubuntu ユーザーを使いたいにも関わらず 8 行目で root ユーザーのまま nvm をインストールしているのは、インストール中に root ユーザーにしかアクセス権が無いディレクトリを触ろうとするからである。

これが Dockerfile でなくローカル環境であるならば sudo を使うかもしれない。

しかし Ubuntu 24.04 の Docker イメージではsudo コマンドはインストールしないと使えないし、インストールしてもパスワードなしで sudo を使えるように設定変更しないと使えない。

だったら root ユーザーのままインストールしてしまったほうがいいと思った。

9行目は . $NVM_DIR/nvm.sh で nvm をロードして以降、nvm を使用するコマンドを連結することが必要である。

. $NVM_DIR/nvm.sh を実行した RUN でしか nvm はロードされていない扱いとなるので、コマンドを連結しないと nvm コマンドが無いというエラーとなる。
ここで本当に時間を溶かした。

最後に 13~17 行目だが、8 行目のコマンドで root ユーザーの .bashrc に書き込まれた内容を ubuntu ユーザーの .bashrc にコピーしている。
こうしないと ubuntu ユーザーでログインしただけでは nvm が使えない。

nvm を使わないバージョン

別に複数バージョンの node を使い分けるわけではないので、Node.js の Prebuilt Binary を直接使えばいいのだと気付いて修正したバージョンが下記である。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
FROM ubuntu:24.04

RUN apt-get -y update && apt-get -y install openjdk-21-jdk wget xz-utils

# https://nodejs.org/en/download/prebuilt-binaries
RUN wget https://nodejs.org/dist/v20.12.2/node-v20.12.2-linux-x64.tar.xz && \
    tar -xf node-v20.12.2-linux-x64.tar.xz && \
    mv node-v20.12.2-linux-x64 /usr/local/lib/node && \
    rm node-v20.12.2-linux-x64.tar.xz

USER ubuntu

RUN echo 'export PATH=$PATH:/usr/local/lib/node/bin' >> ~/.bashrc && \
    export PATH=$PATH:/usr/local/lib/node/bin && \
    npm install -g firebase-tools

WORKDIR /app

nvm を挟まないことによりやっていることがわかりやすくなった。
最初からこっちにしていたらもっと短時間で作業を完了できた気がする。

以上