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 を挟まないことによりやっていることがわかりやすくなった。
最初からこっちにしていたらもっと短時間で作業を完了できた気がする。
以上