依存関係にダイナミックリンクライブラリ (.so ファイル) が含まれている場合、またはローカル環境が Function Compute の実行環境と互換性がない場合は、Dockerfile を使用してレイヤーをビルドします。ネイティブ依存関係のない純粋な言語パッケージ (純粋な Python パッケージなど) の場合は、代わりに Function Compute コンソールまたはローカルマシンに直接インストールしてください。
このトピックでは、例として Node.js ランタイム用の Puppeteer レイヤーをビルドする手順を説明します。
パッケージディレクトリの要件
依存関係をレイヤーの ZIP ファイルにパッケージングする場合、ランタイムに一致するディレクトリに配置します。たとえば、Python ライブラリは、レイヤー ZIP パッケージの /python ディレクトリにパッケージングします。
ダイナミックリンクライブラリを含む依存関係の場合、.so ファイルを ZIP ファイルの /lib ディレクトリに配置します。レイヤーが Function Compute にアップロードされると、これらのファイルは自動的に /opt/lib に解凍されます。
組み込みランタイム:
/opt/libは自動的にLD_LIBRARY_PATHに追加されます。カスタムランタイム: 手動で
/opt/libをLD_LIBRARY_PATHに追加する必要があります。
Puppeteer レイヤーのビルド
ステップ 1: Dockerfile の準備
次の内容で Dockerfile を作成します。
# 関数と同じランタイムバージョンの build-latest イメージを使用します。
# 中国本土にいる場合は、代わりに registry.cn-beijing.aliyuncs.com からプルします。
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.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
# 各 .deb パッケージから .so ファイルを抽出します。
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 を layer.zip にパッケージングします。
# -y フラグはシンボリックリンクを保持します。.[^.]* は親ディレクトリなしで隠しファイルを含みます。
RUN cd /opt \
&& zip -ry layer.zip * .[^.]*
CMD ["bash"]ベースイメージのランタイムバージョンは、関数のランタイムバージョンと一致している必要があります。レイヤーのビルドには build-latest タグを使用してください。ステップ 2: レイヤー ZIP ファイルのビルド
Dockerfile から Docker イメージをビルドします。
sudo docker build -t <layer-image-name> -f Dockerfile .イメージからレイヤー ZIP ファイルをコピーします。
sudo docker run --rm -v $(pwd):/tmp <layer-image-name> sh -c "cp /opt/layer.zip /tmp/"このコマンドは、現在のディレクトリをコンテナ内の
/tmpとしてマウントし、そこにlayer.zipをコピーします。コマンドが完了すると、現在のディレクトリにlayer.zipが表示されます。--rmフラグはコンテナを自動的に削除します。
ステップ 3: カスタムレイヤーの作成
Function Compute コンソールまたは Serverless Devs を使用してレイヤーを作成し、[レイヤーのアップロード方法] を [ZIP パッケージでレイヤーをアップロード] に設定します。詳細な手順については、「カスタムレイヤーの作成」をご参照ください。
Function Compute は、直接使用できるパブリックレイヤーとして Puppeteer を提供しています。詳細については、「例 1: Node.js 16 と Puppeteer を使用してウェブページのスクリーンショットを撮るサンプルプログラム」をご参照ください。
ベースイメージ
Function Compute は、サポートされている各ランタイム用にプリセットされたベースイメージを提供しています。次のフォーマットを使用してイメージをプルします。
docker pull aliyunfc/<runtime-name>:<tag>
# 例:
docker pull aliyunfc/runtime-python3.10:latest利用可能なベースイメージ:
| ランタイム | イメージタグ |
|---|---|
| Python 3.10 | aliyunfc/runtime-python3.10 |
| Python 3.9 | aliyunfc/runtime-python3.9 |
| Python 3.6 | aliyunfc/runtime-python3.6 |
| Node.js 16 | aliyunfc/runtime-nodejs16 |
| Node.js 14 | aliyunfc/runtime-nodejs14 |
| Node.js 12 | aliyunfc/runtime-nodejs12 |
| Java 11 | aliyunfc/runtime-java11 |
| Java 8 | aliyunfc/runtime-java8 |
| .NET Core 2.1 | aliyunfc/runtime-dotnetcore2.1 |
| Go 1 | aliyunfc/runtime-go1 |
| Custom | aliyunfc/runtime-custom |
| Custom (Debian 10) | aliyunfc/runtime-custom.debian10 |
利用可能なイメージとタグの完全なリストについては、GitHub の「fc-docker」をご参照ください。
次のステップ
レイヤーを作成した後、Function Compute コンソールまたは Serverless Devs を使用して関数にバインドします。詳細については、「カスタムレイヤーの設定」をご参照ください。