Benutzerdefinierte Dockerfiles verwenden

Erfahren Sie, wie Sie Ihre eigene benutzerdefinierte Dockerfile mit OCI Functions verwenden.

Wenn Sie eine Funktion mit OCI Functions erstellen oder bereitstellen, wird ein Docker-Image erstellt und an eine Docker-Registry übertragen. Wie bei jedem Docker-Image sind die Anweisungen zum Erstellen des Images in einer Dockerfile enthalten.

Wenn die Funktion in einer der von einem Fn-Projekt-FDK (Functions Development Kit) unterstützten Sprachen geschrieben wird, verwendet OCI Functions die Einstellungen runtime:, build_image: und run_image: in einer func.yaml-Datei, um die Sprache (und damit die Build-Time- und Laufzeitabhängigkeiten) zu bestimmen, die in das Docker-Image aufgenommen werden sollen. Wenn Sie die Funktion mit dem Befehl fn init initialisieren, wird eine func.yaml-Datei für Sie erstellt. Eine func.yaml kann beispielsweise wie folgt aussehen:

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

Wenn Sie die Funktion erstellen oder bereitstellen, verwendet OCI Functions die Einstellungen in der Datei func.yaml, um eine temporäre Dockerfile mit den Anweisungen zum Erstellen des Docker-Image zu erstellen. Beispiel: Eine temporäre Dockerfile wird unten angezeigt.

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

Nachdem das Docker-Image erstellt wurde, löscht OCI Functions die temporäre Dockerfile.

Wenn Sie mehr Kontrolle über das erstellte Docker-Image erhalten möchten, können Sie die von OCI Functions erstellte Dockerfile ändern. Alternativ können Sie Ihre eigene Dockerfile komplett von Grund auf neu erstellen. In beiden Fällen wird die Dockerfile als "benutzerdefinierte Dockerfile" bezeichnet. Dieser Workflow wird manchmal als Bring-Your-Own-Dockerfile oder BYOD bezeichnet.

Wenn Sie die Funktion erstellen oder bereitstellen, verwendet OCI Functions die Anweisungen in der benutzerdefinierten Dockerfile, um das Docker-Image zu erstellen.

So lassen Sie OCI Functions beim Erstellen eines Docker-Images eine benutzerdefinierte Dockerfile verwenden:

  1. Erstellen Sie eine Kopie der Dockerfile, die Sie als benutzerdefinierte Dockerfile verwenden möchten.

  2. Speichern Sie die neue Datei im Verzeichnis, das die Datei func.yaml enthält.

  3. Geben Sie der neuen Datei den Namen Dockerfile.

    Beachten Sie, dass Sie der Datei den Namen Dockerfile geben müssen.

  4. Öffnen Sie die Datei Dockerfile in einem Editor Ihrer Wahl.

    Beispiel: Die Datei Dockerfile kann die folgenden Zeilen enthalten, um Oracle Instant Client von einem oraclelinux:7-slim-Basisimage zu installieren:

    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. Nehmen Sie die folgenden Zeilen in die Datei Dockerfile auf (wie unter Berechtigungen für Container mit aktiven Funktionen beschrieben):

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

    Beispiel:

    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. Speichern Sie die Datei mit dem Namen Dockerfile. Sie können die Datei Dockerfile jetzt als benutzerdefinierte Dockerfile verwenden.

  7. Ändern Sie in der Datei func.yaml den Wert des Parameters runtime: in runtime: docker.

    Beispiel: Wenn die Datei func.yaml die Datei runtime: java enthält, ändern Sie sie in runtime: docker.

  8. Verwenden Sie die Befehle fn build oder fn deploy, um die Funktion zu erstellen oder bereitzustellen.

OCI Functions verwendet die Anweisungen in der benutzerdefinierten Dockerfile (die Datei mit dem Namen Dockerfile), um das Docker-Image für die Funktion zu erstellen und in die Docker-Registry zu übertragen. Mit dem Befehl fn build oder fn deploy wird sichergestellt, dass das Image die erforderlichen Abhängigkeiten enthält, damit es mit der Ausprägung der Anwendung kompatibel ist (siehe Compute-Architektur angeben, auf der Funktionen ausgeführt werden sollen).