OCI Function con immagine custom

Costruisci immagini Docker custom per OCI Functions e aggiungi Oracle Database Client o altre dipendenze alle tue funzioni Python serverless.
OCI Function con immagine custom
OCI Function con immagine custom

Come abbiamo visto in altri articoli, e’ possibile usare il progetto FN con diversi linguaggi di programmazione tramite immagini container predefinite. I linguaggi ufficialmente supportati sono:

  • go
  • java
  • Node.js
  • ruby
  • Python
  • C#

Puoi farlo con la direttiva runtime, ad esempio:

fn init --runtime python test

Il comando produce un file func.yaml di questo tipo:

1
2
3
4
5
6
7
8
schema_version: 20180708
name: hello
version: 0.0.1
runtime: python
build_image: fnproject/python:3.9-dev
run_image: fnproject/python:3.9
entrypoint: /python/bin/fdk /function/func.py handler
memory: 256

In alcuni casi, pero’, le immagini predefinite non sono sufficienti: puo’ servire supporto extra per un linguaggio, driver aggiuntivi o strumenti non presenti.

Per risolvere il problema possiamo usare un Dockerfile e un ambiente custom. Possiamo estendere l’immagine FN di base oppure partire da un’immagine completamente diversa.

Come demo ho creato questo esempio . In particolare il file func.yaml e’ il seguente:

1schema_version: 20180708
2name: customimage
3version: 0.0.1
4runtime: docker
5memory: 256

In questo modo FN usa un Dockerfile locale, salvato allo stesso livello, per creare l’ambiente di esecuzione della funzione. Nell’esempio il Dockerfile e’ questo:

 1FROM fnproject/python:3.9
 2WORKDIR /function
 3ADD requirements.txt /function/
 4
 5RUN pip3 install --target /python/ --no-cache --no-cache-dir -r requirements.txt &&\
 6    rm -fr ~/.cache/pip /tmp* requirements.txt func.yaml Dockerfile .venv &&\
 7    chmod -R o+r /python
 8
 9# install Oracle database client
10RUN microdnf install oracle-instantclient-release-el8 &&\
11    microdnf install oracle-instantclient-basic &&\
12    microdnf clean all
13
14ADD . /function/
15
16RUN chmod -R o+r /function
17
18ENV PYTHONPATH=/function:/python
19
20ENTRYPOINT ["/python/bin/fdk", "/function/func.py", "handler"]

In questo Dockerfile abbiamo personalizzato l’immagine ufficiale Python 3.9 con il client database Oracle.

E’ possibile fare test locali senza distribuire ogni volta l’immagine nel repository remoto usando l’opzione --local nella fase di deploy:

fn deploy --app app --local

Eseguendo il server FN in locale sara’ possibile eseguire il codice della funzione come su OCI, ma localmente.

Avvia quindi in un terminale separato l’istanza del server FN:

fn start

E in un altro terminale il classico comando di invocazione, per esempio:

echo -n '{"name": "Oracle"}' | fn invoke app hello

Domande frequenti

Posso usare un'immagine Docker personalizzata con OCI Functions?

Sì. OCI Functions supporta immagini container personalizzate. Costruisci un Dockerfile che estende una delle immagini base del Fn Project o parte da zero, la pubblichi su OCI Container Registry (OCIR) e la referenzi nella configurazione della funzione.

Perché potrei aver bisogno di un'immagine Docker personalizzata per una OCI Function?

Hai bisogno di un'immagine personalizzata quando la tua funzione dipende da librerie di sistema non disponibili nelle immagini base standard del Fn Project, come Oracle Instant Client per la connettività al database o pacchetti OS specifici.

Qual è la dimensione massima dell'immagine container per OCI Functions?

OCI raccomanda di mantenere le immagini sotto i 256 MB per cold start veloci. Immagini più grandi sono tecnicamente supportate ma aumentano significativamente la latenza di cold start.

Approfondimenti correlati