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:
-
Faça uma cópia do Dockerfile que você deseja usar como um Dockerfile personalizado.
-
Salve o novo arquivo no diretório que contém o arquivo func.yaml.
-
Atribua ao novo arquivo o nome
Dockerfile
.Observe que você deve nomear o arquivo como
Dockerfile
. -
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
-
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
-
Salve o arquivo chamado
Dockerfile
. Agora você pode usar o arquivoDockerfile
como um Dockerfile personalizado. -
No arquivo func.yaml, altere o valor do parâmetro
runtime:
pararuntime: docker
.Por exemplo, se o arquivo func.yaml contiver
runtime: java
, altere-o pararuntime: docker
. -
Use os comandos
fn build
oufn 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).