Use um Dockerfile para compilar uma camada quando a dependência incluir uma biblioteca de vínculo dinâmico (arquivo .so) ou quando o ambiente local for incompatível com o ambiente de execução do Function Compute. Para pacotes de linguagem pura sem dependências nativas (como pacotes Python puros), instale-os diretamente no console do Function Compute ou na máquina local.
Este tópico demonstra a compilação de uma camada do Puppeteer para um runtime Node.js como exemplo.
Requisitos de diretório do pacote
Ao empacotar dependências em um arquivo ZIP de camada, coloque-as no diretório correspondente ao seu runtime. Por exemplo, armazene a biblioteca Python no diretório /python do pacote ZIP da camada.
Para dependências que incluem bibliotecas de vínculo dinâmico, armazene os arquivos .so no diretório /lib do arquivo ZIP. Após o upload da camada para o Function Compute, o sistema descompacta esses arquivos automaticamente em /opt/lib.
Runtimes integrados: O sistema adiciona automaticamente o caminho
/opt/libà variávelLD_LIBRARY_PATH.Runtimes personalizados: Adicione
/opt/libà variávelLD_LIBRARY_PATHmanualmente.
Compilar uma camada do Puppeteer
Etapa 1: Preparar um Dockerfile
Crie um arquivo Dockerfile com o seguinte conteúdo:
# Use the build-latest image for the same runtime version as your function.
# If you are in the Chinese mainland, pull from registry.cn-beijing.aliyuncs.com instead.
FROM aliyunfc/runtime-nodejs14:build-latest
# Set environment variables and working directory.
ENV PATH /opt/bin:$PATH
ENV LD_LIBRARY_PATH /opt/lib
ENV NODE_PATH /opt/nodejs/node_modules
WORKDIR /tmp
# Install Puppeteer to /opt/nodejs.
COPY ./package.json /opt/nodejs/
RUN cd /opt/nodejs \
&& npm --registry https://registry.npmmirror.com i
# Download system dependency .deb files to /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
# Extract .so files from each .deb package.
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;
# Copy extracted .so files to /opt/lib.
RUN cp -r /tmp/install/usr/bin /opt/; \
cp -r /tmp/install/usr/lib/x86_64-linux-gnu/* /opt/lib/
# Package /opt into layer.zip.
# The -y flag preserves symbolic links. .[^.]* includes hidden files without the parent directory.
RUN cd /opt \
&& zip -ry layer.zip * .[^.]*
CMD ["bash"]
A versão do runtime da imagem base deve corresponder à versão do runtime da sua função. Use a tag build-latest para compilações de camadas.
Etapa 2: Compilar o arquivo ZIP da camada
-
Compile a imagem Docker a partir do Dockerfile:
sudo docker build -t <layer-image-name> -f Dockerfile . -
Copie o arquivo ZIP da camada para fora da imagem:
sudo docker run --rm -v $(pwd):/tmp <layer-image-name> sh -c "cp /opt/layer.zip /tmp/"Esse comando monta o diretório atual como
/tmpdentro do contêiner e copia o arquivolayer.zippara esse local. Após a conclusão do comando, o arquivolayer.zipaparece no diretório atual. A flag--rmremove o contêiner automaticamente.
Etapa 3: Criar uma camada personalizada
No console do Function Compute ou com o Serverless Devs, crie uma camada e defina o Layer Upload Method como Upload Layer in ZIP Package. Para obter etapas detalhadas, consulte Criar uma camada personalizada.
Imagens base
O Function Compute fornece imagens base predefinidas para cada runtime compatível. Baixe uma imagem usando o seguinte formato:
docker pull aliyunfc/<runtime-name>:<tag>
# Example:
docker pull aliyunfc/runtime-python3.10:latest
Imagens base disponíveis:
|
Runtime |
Tags da imagem |
|
Python 3,10 |
|
|
Python 3,9 |
|
|
Python 3,6 |
|
|
Node.js 16 |
|
|
Node.js 14 |
|
|
Node.js 12 |
|
|
Java 11 |
|
|
Java 8 |
|
|
.NET Core 2,1 |
|
|
Go 1 |
|
|
Personalizado |
|
|
Personalizado (Debian 10) |
Para obter a lista completa de imagens e tags disponíveis, consulte fc-docker no GitHub.
Próximos passos
Após criar uma camada, vincule-a a uma função no console do Function Compute ou com o Serverless Devs. Para mais detalhes, consulte Configurar uma camada personalizada.