Uso de Dockerfiles personalizados

Descubra cómo utilizar su propio archivo Dockerfile personalizado para funciones basadas en imágenes en OCI Functions.

Al crear o desplegar una función basada en imágenes con OCI Functions, se crea una imagen de Docker y se transfiere a un registro de Docker. Al igual que con cualquier imagen de Docker, las instrucciones para crear la imagen se incluyen en un archivo Dockerfile.

Nota

Este tema se aplica a las funciones basadas en imágenes creadas y desplegadas mediante la CLI de Fn Project. Las funciones de solo código se crean a partir de archivos y no requieren que cree ni utilice un archivo Dockerfile.

Si una función basada en imágenes se escribe en uno de los idiomas soportados por un FDK de Fn Project (kit de desarrollo de funciones), OCI Functions utiliza la configuración runtime:, build_image: y run_image: en un archivo func.yaml para determinar el idioma (y, por lo tanto, las dependencias de tiempo de creación y tiempo de ejecución) que se va a incluir en la imagen de Docker. Si utiliza el comando fn init para inicializar la función, se crea un archivo func.yaml. Por ejemplo, un func.yaml puede tener el siguiente aspecto:

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

Al crear o desplegar la función basada en imágenes, OCI Functions utiliza la configuración del archivo func.yaml para crear un archivo Dockerfile temporal que contenga las instrucciones a partir de las que se cree la imagen de Docker. Por ejemplo, a continuación se muestra un archivo Dockerfile temporal.

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

Una vez creada la imagen de Docker, OCI Functions suprime el archivo Dockerfile temporal.

Si desea tener más control sobre la imagen de Docker que se crea para una función basada en imágenes, puede modificar el archivo Dockerfile que crea OCI Functions. También puede crear su propio archivo Dockerfile completamente desde cero. En ambos casos, el archivo Dockerfile se denomina "archivo Dockerfile personalizado". Este flujo de trabajo se conoce a veces como Bring-Your-Own-Dockerfile o BYOD.

Al crear o desplegar la función, OCI Functions utiliza las instrucciones del archivo Dockerfile personalizado para crear la imagen de Docker.

Para que OCI Functions utilice un archivo Dockerfile personalizado al crear una imagen de Docker para una función basada en imágenes:

  1. Realice una copia del Dockerfile que desea utilizar como Dockerfile personalizado.

  2. Guarde el archivo nuevo en el directorio que contiene el archivo func.yaml.

  3. Asigne al nuevo archivo el nombre Dockerfile.

    Tenga en cuenta que debe asignar al archivo el nombre Dockerfile.

  4. Abra el archivo denominado Dockerfile en un editor de su elección.

    Por ejemplo, el archivo Dockerfile puede contener las siguientes líneas para instalar Oracle Instant Client desde una imagen base de 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. Incluya las siguientes líneas en el archivo denominado Dockerfile (como se describe en Permisos otorgados a entornos de ejecución de funciones):

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

    Por ejemplo:

    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. Guarde el archivo denominado Dockerfile. Ahora puede utilizar el archivo Dockerfile como archivo Dockerfile personalizado.

  7. En el archivo func.yaml, cambie el valor del parámetro runtime: a runtime: docker.

    Por ejemplo, si el archivo func.yaml contiene runtime: java, cámbielo a runtime: docker.

  8. Utilice los comandos de fn build o fn deploy para crear o desplegar la función.

OCI Functions utiliza las instrucciones del archivo Dockerfile personalizado (el archivo denominado Dockerfile) para crear la imagen de Docker para la función basada en imágenes y transferirla al registro de Docker. El uso del comando fn build o fn deploy garantiza que la imagen incluya las dependencias necesarias para que sea compatible con la unidad de la aplicación (consulte Especificación de la arquitectura de recursos informáticos en la que ejecutar funciones).