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:
-
Erstellen Sie eine Kopie der Dockerfile, die Sie als benutzerdefinierte Dockerfile verwenden möchten.
-
Speichern Sie die neue Datei im Verzeichnis, das die Datei func.yaml enthält.
-
Geben Sie der neuen Datei den Namen
Dockerfile
.Beachten Sie, dass Sie der Datei den Namen
Dockerfile
geben müssen. -
Ö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
-
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
-
Speichern Sie die Datei mit dem Namen
Dockerfile
. Sie können die DateiDockerfile
jetzt als benutzerdefinierte Dockerfile verwenden. -
Ändern Sie in der Datei func.yaml den Wert des Parameters
runtime:
inruntime: docker
.Beispiel: Wenn die Datei func.yaml die Datei
runtime: java
enthält, ändern Sie sie inruntime: docker
. -
Verwenden Sie die Befehle
fn build
oderfn 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).