全部產品
Search
文件中心

Function Compute:如何基於Dockerfile構建層

更新時間:Jul 06, 2024

本文以Node.js安裝Puppeteer依賴為例,介紹如何基於Dockerfile構建層。

背景資訊

Function Compute提供了多種構建層的方式,對於不包含動態連結程式庫的依賴(例如純Python庫),可直接使用控制台線上安裝依賴的方式或使用本地構建的方式構建層。依賴中包含動態連結程式庫,或者本地環境與Function Compute的運行時環境不相容時,不支援通過控制台或本地構建的方式構建層,只能基於Dockerfile構建層。

構建層時,各個語言的依賴庫建議按照頁面建立自訂層的說明打包到層ZIP包的指定目錄下。例如,Python庫打包到層ZIP包的/python目錄下。如果依賴庫中包含動態連結程式庫,建議將動態連結程式庫放到層ZIP包的/lib目錄下。使用內建運行時,會預設將目錄/opt/lib添加到路徑LD_LIBRARY_PATH;使用自訂運行時,則需要手動添加。

構建Puppeteer層

步驟一:準備Dockerfile檔案

樣本如下。

FROM aliyunfc/runtime-nodejs14:build-latest

ENV PATH /opt/bin:$PATH
ENV LD_LIBRARY_PATH /opt/lib
ENV NODE_PATH /opt/nodejs/node_modules
WORKDIR /tmp

# 安裝Puppeteer庫到/opt/nodejs目錄
COPY ./package.json /opt/nodejs/
RUN cd /opt/nodejs \
    && npm --registry https://registry.npm.taobao.org i

# 將需要安裝到系統依賴庫的.deb檔案下載到/tmp/install/archives目錄。
RUN mkdir -p /opt/lib /tmp/install
RUN apt-get update && apt-get install -y -d -o=dir::cache=/tmp/install \
    libblas3 fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 \
    libgtk-3-0 libnspr4 libnss3 libpangocairo-1.0-0 libxcb-dri3-0 \
    libx11-xcb1 libxcb1 libxss1 libxtst6 lsb-release \
    xdg-utils libatspi2.0-0 libatk1.0-0 libxkbcommon0 libepoxy0 \
    libglapi-mesa libnspr4 libgbm-dev \
    --reinstall --no-install-recommends

RUN for f in $(ls /tmp/install/archives/*.deb); do \
        echo "Preparing to unpack ${f##*/}"; \
        cd /tmp/install/archives; \
        dpkg-deb -x ${f##*/} /tmp/install; \
    done;

# 拷貝安裝的.so檔案到/opt/lib目錄。
RUN cp -r /tmp/install/usr/bin /opt/; \
    cp -r /tmp/install/usr/lib/x86_64-linux-gnu/* /opt/lib/

# zip file
# -y   store symbolic links as the link instead of the referenced file
# .[^.]*    including hidden files and exclude the parent directory
RUN cd /opt \
    && zip -ry layer.zip * .[^.]*

CMD ["bash"]

解析如下。

  • Function Compute提供了各種運行時的基礎鏡像,您可以從Function Compute的基本鏡像中尋找對應的鏡像地址。推薦使用build-latest的鏡像進行構建。

    說明

    在本地構建層時,使用的基礎鏡像的運行時版本需要和函數的運行時版本保持一致。

    FROM aliyunfc/runtime-nodejs14:build-latest
  • 聲明環境變數,並指定工作目錄/tmp

  • ENV PATH /opt/bin:$PATH
    ENV LD_LIBRARY_PATH /opt/lib
    ENV NODE_PATH /opt/nodejs/node_modules
    WORKDIR /tmp
  • 安裝Puppeteer庫到/opt/nodejs目錄。

  • # 安裝Puppeteer庫到/opt/nodejs目錄
    COPY ./package.json /opt/nodejs/
    RUN cd /opt/nodejs \
        && npm --registry https://registry.npm.taobao.org i
  • 將需要安裝到系統依賴庫的.deb檔案下載到/tmp/install/archives目錄。

  • # 將需要安裝到系統依賴庫的.deb檔案下載到/tmp/install/archives目錄。
    RUN mkdir -p /opt/lib /tmp/install
    RUN apt-get update && apt-get install -y -d -o=dir::cache=/tmp/install \
        libblas3 fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 \
        libgtk-3-0 libnspr4 libnss3 libpangocairo-1.0-0 libxcb-dri3-0 \
        libx11-xcb1 libxcb1 libxss1 libxtst6 lsb-release \
        xdg-utils libatspi2.0-0 libatk1.0-0 libxkbcommon0 libepoxy0 \
        libglapi-mesa libnspr4 libgbm-dev \
        --reinstall --no-install-recommends
  • 依次將.deb檔案下載到/tmp/install目錄。

  • RUN for f in $(ls /tmp/install/archives/*.deb); do \
            echo "Preparing to unpack ${f##*/}"; \
            cd /tmp/install/archives; \
            dpkg-deb -x ${f##*/} /tmp/install; \
        done;
  • 拷貝安裝的.so檔案到/opt/lib目錄。

  • # 拷貝安裝的.so檔案到/opt/lib目錄。
    RUN cp -r /tmp/install/usr/bin /opt/; \
        cp -r /tmp/install/usr/lib/x86_64-linux-gnu/* /opt/lib/
  • /opt/lib目錄下的檔案打包成ZIP格式的壓縮包,注意添加-y參數保留軟連結。

  • # zip file
    # -y   store symbolic links as the link instead of the referenced file
    # .[^.]*    including hidden files and exclude the parent directory
    RUN cd /opt \
        && zip -ry layer.zip * .[^.]*

步驟二:構建層ZIP包

  1. 執行以下命令,使用Dockerfile檔案打包鏡像。

    sudo docker build -t ${layer-image-name} -f Dockerfile .
  2. 執行以下命令,將層ZIP包從鏡像中拷貝出來。

    sudo docker run --rm -v $(pwd):/tmp ${layer-image-name} sh -c "cp /opt/layer.zip /tmp/"

步驟三:建立自訂層

通過控制台或者Serverless Devs建立層。具體操作,請參見建立自訂層

說明

Function Compute已將Puppeteer製作為官方公用層,您也可以直接使用。具體操作,請參見樣本一:基於Node.js 16和Puppeteer實現網頁截圖樣本程式

Function Compute的基本鏡像

更多資訊,請參見Function Compute基本鏡像