全部產品
Search
文件中心

Function Compute:如何基於Dockerfile構建層

更新時間:Jul 06, 2024

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

注意事項

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

構建Puppeteer層

步驟一:準備Dockerfile檔案

樣本如下。

# 指定構建鏡像的基礎鏡像,推薦使用build-latest的鏡像進行構建。
# 在本地構建層時,使用的基礎鏡像的運行時版本需要和函數的運行時版本保持一致。
# 中國內地使用者建議使用registry.cn-beijing.aliyuncs.com倉庫的基礎鏡像。
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目錄。
COPY ./package.json /opt/nodejs/
RUN cd /opt/nodejs \
    && npm --registry https://registry.npmmirror.com 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/

# 將/opt/lib目錄下的檔案打包成ZIP格式的壓縮包。注意添加-y參數保留軟連結。
# .[^.]* 表示包含隱藏檔案並排除父目錄。
RUN cd /opt \
    && zip -ry layer.zip * .[^.]*

CMD ["bash"]

步驟二:構建層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/"

步驟三:建立自訂層

層ZIP包構建完成後,您可以通過Function Compute控制台或者Serverless Devs建立層。層上傳方式選擇通過ZIP包上傳,具體操作,請參見建立自訂層

Function Compute的基本鏡像

以下列舉Function Compute針對不同的語言及開發環境預置的基本鏡像。實際使用時,您可以從對應鏡像倉庫路徑直接拉取,拉取指令碼如docker pull aliyunfc/runtime-python3.10:latest

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

後續操作

層建立完成後,您可以通過Function Compute控制台或Serverless Devs將其綁定到函數,以便函數訪問層中提供的資源。具體操作,請參見配置自訂層