Uso di Dockerfile personalizzati
Scopri come utilizzare il tuo Dockerfile personalizzato con OCI Functions.
Quando crei o distribuisci una funzione con OCI Functions, un'immagine Docker viene creata e sottoposta a push in un registro Docker. Come con qualsiasi immagine Docker, le istruzioni per creare l'immagine sono contenute in un Dockerfile.
Se la funzione è scritta in una delle lingue supportate da un FN Project FDK (Functions Development Kit), OCI Functions utilizza le impostazioni runtime:
, build_image:
e run_image:
in un file func.yaml per determinare la lingua (e quindi le dipendenze di build-time e run-time) da includere nell'immagine Docker. Se si utilizza il comando fn init
per inizializzare la funzione, viene creato automaticamente un file func.yaml. Ad esempio, un func.yaml potrebbe avere l'aspetto seguente:
schema_version: 20180708
name: hello-java
version: 0.0.1
runtime: java
build_image: fnproject/fn-java-fdk-build:jdk11-1.0.116
run_image: fnproject/fn-java-fdk:jre11-1.0.116
cmd: com.example.fn.HelloFunction::handleRequest
Quando si crea o distribuisce la funzione, OCI Functions utilizza le impostazioni nel file func.yaml per creare un Dockerfile temporaneo contenente le istruzioni da cui creare l'immagine Docker. Ad esempio, un Dockerfile temporaneo viene mostrato di seguito.
FROM fnproject/fn-java-fdk-build:jdk11-1.0.116 as build-stage
WORKDIR /function
ENV MAVEN_OPTS -Dhttp.proxyHost= -Dhttp.proxyPort= -Dhttps.proxyHost= -Dhttps.proxyPort= -Dhttp.nonProxyHosts= -Dmaven.repo.local=/usr/share/maven/ref/repository
ADD pom.xml /function/pom.xml
RUN ["mvn", "package", "dependency:copy-dependencies", "-DincludeScope=runtime", "-DskipTests=true", "-Dmdep.prependGroupId=true", "-DoutputDirectory=target", "--fail-never"]
ADD src /function/src
RUN ["mvn", "package"]
FROM fnproject/fn-java-fdk:jre11-1.0.116
WORKDIR /function
COPY --from=build-stage /function/target/*.jar /function/app/
CMD ["com.example.fn.HelloFunction::handleRequest"]
Dopo aver creato l'immagine Docker, OCI Functions elimina il Dockerfile temporaneo.
Se desideri un maggiore controllo sull'immagine Docker creata, puoi modificare il Dockerfile creato da OCI Functions. In alternativa, puoi creare il tuo Dockerfile interamente da zero. In entrambi i casi, il Dockerfile viene definito "dockerfile personalizzato". Questo flusso di lavoro viene talvolta denominato Bring-Your-Own-Dockerfile o BYOD.
Quando crei o distribuisci la funzione, OCI Functions utilizza le istruzioni nel Dockerfile personalizzato per creare l'immagine Docker.
Per fare in modo che le funzioni OCI utilizzino un Dockerfile personalizzato durante la creazione di un'immagine Docker:
-
Creare una copia del Dockerfile che si desidera utilizzare come Dockerfile personalizzato.
-
Salvare il nuovo file nella directory che contiene il file func.yaml.
-
Assegnare al nuovo file il nome
Dockerfile
.Si noti che è necessario assegnare un nome al file
Dockerfile
. -
Aprire il file denominato
Dockerfile
in un editor a scelta.Ad esempio, il file
Dockerfile
potrebbe contenere le righe seguenti per installare Oracle Instant Client da un'immagine di base oraclelinux:7-slim:FROM oraclelinux:7-slim RUN yum -y install oracle-release-el7 oracle-nodejs-release-el7 && \ yum-config-manager --disable ol7_developer_EPEL && \ yum -y install oracle-instantclient19.3-basiclite nodejs && \ rm -rf /var/cache/yum WORKDIR /function ADD . /function/ RUN npm install CMD exec node func.js
-
Includere le righe seguenti nel file denominato
Dockerfile
(come descritto nella sezione Autorizzazioni concesse alle funzioni di esecuzione dei contenitori):groupadd --gid 1000 fn && \ adduser --uid 1000 --gid fn fn
Ad esempio:
FROM oraclelinux:7-slim RUN yum -y install oracle-release-el7 oracle-nodejs-release-el7 && \ yum-config-manager --disable ol7_developer_EPEL && \ yum -y install oracle-instantclient19.3-basiclite nodejs && \ rm -rf /var/cache/yum && \ groupadd --gid 1000 fn && \ adduser --uid 1000 --gid fn fn WORKDIR /function ADD . /function/ RUN npm install CMD exec node func.js
-
Salvare il file denominato
Dockerfile
. Ora è possibile utilizzare il fileDockerfile
come Dockerfile personalizzato. -
Nel file func.yaml, modificare il valore del parametro
runtime:
inruntime: docker
.Ad esempio, se il file func.yaml contiene
runtime: java
, modificarlo inruntime: docker
. -
Utilizzare i comandi
fn build
ofn deploy
per creare o distribuire la funzione.
OCI Functions utilizza le istruzioni nel Dockerfile personalizzato (il file denominato Dockerfile
) per creare l'immagine Docker per la funzione ed eseguirne il push nel registro Docker. L'uso del comando fn build
o fn deploy
garantisce che l'immagine includa le dipendenze necessarie per renderla compatibile con la forma dell'applicazione (vedere Specifica dell'architettura di calcolo su cui eseguire le funzioni).