Usando Dockerfiles Personalizados

Descubra como usar seu próprio Dockerfile personalizado com o OCI Functions.

Quando você cria ou implanta uma função com o OCI Functions, uma imagem do Docker é criada e enviada para um registro do Docker. Como acontece com qualquer imagem do Docker, as instruções para criar a imagem estão contidas em um Dockerfile.

Se a função for gravada em um dos idiomas suportados por um Fn Project FDK (Kit de Desenvolvimento de Funções), o OCI Functions usará as definições runtime:, build_image: e run_image: em um arquivo func.yaml para determinar o idioma (e, portanto, as dependências de tempo de build e tempo de execução) a serem incluídas na imagem do Docker. Se você usar o comando fn init para inicializar a função, um arquivo func.yaml será criado para você. Por exemplo, uma func.yaml pode ter esta aparência:

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 você cria ou implanta a função, o OCI Functions usa as definições no arquivo func.yaml para criar um Dockerfile temporário contendo as instruções para criar a imagem do Docker. Por exemplo, um Dockerfile temporário é mostrado abaixo.

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

Após criar a imagem do Docker, o OCI Functions exclui o Dockerfile temporário.

Se quiser ter mais controle sobre a imagem do Docker criada, você poderá modificar o Dockerfile criado pelo OCI Functions. Como alternativa, você pode criar seu próprio Dockerfile inteiramente do zero. Em ambos os casos, o Dockerfile é chamado de "Dockerfile personalizado". Este workflow às vezes é chamado de Bring-Your-Own-Dockerfile ou BYOD.

Quando você cria ou implanta a função, o OCI Functions usa as instruções no Dockerfile personalizado para criar a imagem do Docker.

Para que o OCI Functions use um Dockerfile personalizado ao criar uma imagem do Docker:

  1. Faça uma cópia do Dockerfile que você deseja usar como um Dockerfile personalizado.

  2. Salve o novo arquivo no diretório que contém o arquivo func.yaml.

  3. Atribua ao novo arquivo o nome Dockerfile.

    Observe que você deve nomear o arquivo como Dockerfile.

  4. Abra o arquivo chamado Dockerfile em um editor de sua escolha.

    Por exemplo, o arquivo Dockerfile pode conter as seguintes linhas para instalar o Oracle Instant Client a partir de uma imagem 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. Inclua as seguintes linhas no arquivo chamado Dockerfile (conforme descrito em Permissões Concedidas a Funções de Execução de Contêineres):

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

    Por exemplo:

    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. Salve o arquivo chamado Dockerfile. Agora você pode usar o arquivo Dockerfile como um Dockerfile personalizado.

  7. No arquivo func.yaml, altere o valor do parâmetro runtime: para runtime: docker.

    Por exemplo, se o arquivo func.yaml contiver runtime: java, altere-o para runtime: docker.

  8. Use os comandos fn build ou fn deploy para criar ou implantar a função.

O OCI Functions usa as instruções no Dockerfile personalizado (o arquivo chamado Dockerfile) para criar a imagem do Docker para a função e enviá-la ao registro do Docker. O uso do comando fn build ou fn deploy garante que a imagem inclua as dependências necessárias para torná-la compatível com a forma do aplicativo (consulte Especificando a Arquitetura de Computação na Qual Executar Funções).