Container安裝 node 透過Dockerfile 使用nvm進行安裝

Container安裝 node 透過Dockerfile 使用nvm進行安裝

在開發和部署過程中,我們經常需要在 Docker 容器中使用特定版本的 Node.js 和 npm,比如用 PM2 來管理 Node.js 應用。雖然可以使用容器預設的 Node.js,但為了確保環境的一致性和可控性,我們往往希望固定使用特定版本。這就引出了如何在 Docker 容器中精確控制 Node.js 環境的問題。解決這個需求的核心步驟是撰寫一個自定義的 Dockerfile,並正確使用它來創建和運行容器。

而為什麼不用 php 8.2-fpm-alpine ,是因為精簡版的容器中,有很多所需要的依賴 是沒有的 所以會讓編譯過程中不斷地產生失敗,若要同個容器中有多個環境的話 則建議使用ubuntu 會比較好一點。

以下範本 選用 php 8.2-fpm版本 內建是ubuntu,使用nvm 並且將版本定義成一個環境變量,這樣就可以隨時變更該Dockerfile,不用重複的去做很多事情。

Docker Image: php 8.2-fpm

# Dockerfile 
FROM php:8.2-fpm 
# 定義一個node 環境變量 可以隨時更改 node 版本  
# 只需要20 18 16 ... 等 
ENV NODE_VERSION 20 
 
RUN set -eux; \ 
apt-get update && \ 
apt-get install -y --no-install-recommends \ 
    git \ 
    default-mysql-client \ 
    default-libmysqlclient-dev \ 
    vim \ 
    zlib1g-dev \ 
    libbz2-dev \ 
    libzip-dev \ 
    libreadline-dev \ 
    libsqlite3-dev \ 
    libncurses5-dev \ 
    libncursesw5-dev \ 
    xz-utils \ 
    zip \ 
    imagemagick \ 
    unzip \ 
    libssl-dev \ 
    wget \ 
    telnet \ 
    iproute2 \ 
    libfreetype6-dev \ 
    libjpeg62-turbo-dev \ 
    libpng-dev \ 
    iputils-ping \ 
    libxslt1-dev \ 
    procps \ 
    libmagickwand-dev \ 
    build-essential  
     
    # 安裝 nvm 
    ENV NVM_DIR /root/.nvm 
    RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash \ 
        && . $NVM_DIR/nvm.sh \ 
        && nvm install $NODE_VERSION \ 
        && nvm alias default $NODE_VERSION \ 
        && nvm use default 
     
 
# node 
RUN npm install pm2 -g