Utiliser des fichiers Dockerfiles personnalisés

Découvrez comment utiliser votre propre fichier Dockerfile personnalisé avec OCI Functions.

Lorsque vous créez ou déployez une fonction avec OCI Functions, une image Docker est créée et propagée vers un registre Docker. Comme pour toute image Docker, les instructions de création de l'image sont contenues dans un fichier Dockerfile.

Si la fonction est écrite dans l'un des langages pris en charge par un kit de développement de projet Fn (kit de développement Functions), OCI Functions utilise les paramètres runtime:, build_image: et run_image: dans un fichier func.yaml pour déterminer la langue (et donc les dépendances de build et d'exécution) à inclure dans l'image Docker. Si vous utilisez la commande fn init pour initialiser la fonction, un fichier func.yaml est créé pour vous. Par exemple, un élément func.yaml peut ressembler à :

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

Lorsque vous créez ou déployez la fonction, OCI Functions utilise les paramètres du fichier func.yaml pour créer un fichier Dockerfile temporaire contenant les instructions à partir desquelles créer l'image Docker. Par exemple, un fichier Dockerfile temporaire est affiché ci-dessous.

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"]

Après avoir créé l'image Docker, OCI Functions supprime le fichier Dockerfile temporaire.

Si vous souhaitez davantage de contrôle sur l'image Docker créée, vous pouvez modifier le fichier Dockerfile créé par OCI Functions. Vous pouvez également créer votre propre fichier Dockerfile entièrement à partir de zéro. Dans les deux cas, le fichier Dockerfile est appelé "fichier Dockerfile personnalisé". Ce flux de travail est parfois appelé Bring-Your-Own-Dockerfile ou BYOD.

Lorsque vous créez ou déployez la fonction, OCI Functions utilise les instructions du fichier Dockerfile personnalisé pour créer l'image Docker.

Pour qu'OCI Functions utilise un fichier Dockerfile personnalisé lors de la création d'une image Docker, procédez comme suit :

  1. Créez une copie du fichier Dockerfile à utiliser en tant que fichier Dockerfile personnalisé.

  2. Enregistrez le nouveau fichier dans le répertoire contenant le fichier func.yaml.

  3. Attribuez au nouveau fichier le nom Dockerfile.

    Vous devez nommer le fichier Dockerfile.

  4. Ouvrez le fichier nommé Dockerfile dans l'éditeur de votre choix.

    Par exemple, le fichier Dockerfile peut contenir les lignes suivantes pour installer Oracle Instant Client à partir d'une image de 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
  5. Incluez les lignes suivantes dans le fichier nommé Dockerfile (comme décrit dans Droits d'accès accordés aux conteneurs exécutant des fonctions) :

    groupadd --gid 1000 fn && \
    adduser --uid 1000 --gid fn fn

    Par exemple :

    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
  6. Enregistrez le fichier nommé Dockerfile. Vous pouvez désormais utiliser le fichier Dockerfile en tant que fichier Dockerfile personnalisé.

  7. Dans le fichier func.yaml, remplacez la valeur du paramètre runtime: par runtime: docker.

    Par exemple, si le fichier func.yaml contient runtime: java, remplacez-le par runtime: docker.

  8. Utilisez les commandes fn build ou fn deploy pour créer ou déployer la fonction.

OCI Functions utilise les instructions du fichier Dockerfile personnalisé (fichier nommé Dockerfile) pour créer l'image Docker de la fonction et la propager vers le registre Docker. L'utilisation de la commande fn build ou fn deploy garantit que l'image inclut les dépendances nécessaires pour la rendre compatible avec la forme de l'application (reportez-vous à Spécification de l'architecture de calcul sur laquelle exécuter des fonctions).