カスタムDockerfileの使用

OCI Functionsで独自のカスタムDockerfileを使用する方法をご紹介します。

OCI Functionsを使用してファンクションをビルドまたはデプロイすると、Dockerイメージが作成され、Dockerレジストリにプッシュされます。Dockerイメージと同様に、イメージを構築する手順はDockerfileに含まれています。

ファンクションがFn Project FDK (ファンクション開発キット)でサポートされている言語のいずれかで記述されている場合、OCI Functionsはfunc.yamlファイルのruntime:build_image:およびrun_image:設定を使用して、Dockerイメージに含める言語(したがって、ビルド時およびランタイムの依存関係)を決定します。fn initコマンドを使用してファンクションを初期化すると、func.yamlファイルが作成されます。たとえば、func.yamlは次のようになります:

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

ファンクションの構築またはデプロイを行うと、OCIファンクションはfunc.yamlファイルの設定を使用して、Dockerイメージの構築のための命令を含む一時Dockerfileを作成します。たとえば、一時的なDockerfileを次に示します。

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

Dockerイメージを作成した後、OCI Functionsは一時Dockerfileを削除します。

作成されるDockerイメージをより詳細に制御する場合は、OCI Functionsが作成するDockerfileを変更できます。または、独自のDockerfileを完全に最初から作成できます。どちらの場合も、DockerfileはカスタムDockerfileと呼ばれます。このワークフローは、Bring-Your-Own-DockerfileまたはBYODと呼ばれることもあります。

ファンクションをビルドまたはデプロイすると、OCI FunctionsはカスタムDockerfileの手順を使用してDockerイメージを構築します。

Dockerイメージの構築時にOCI FunctionsでカスタムDockerfileを使用するには:

  1. カスタムDockerfileとして使用するDockerfileのコピーを作成します。

  2. 新しいファイルをfunc.yamlファイルを含むディレクトリに保存します。

  3. 新しいファイルにDockerfileという名前を付けます。

    ファイルにDockerfileという名前を付ける必要があります。

  4. Dockerfileという名前のファイルを任意のエディタで開きます。

    たとえば、Dockerfileファイルには、oraclelinux:7-slimベース・イメージからOracle Instant Clientをインストールするための次の行が含まれる場合があります。

    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. Dockerfileという名前のファイルに次の行を含めます(「ファンクションを実行しているコンテナに付与される権限」を参照)。

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

    例:

    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. Dockerfileという名前のファイルを保存します。DockerfileファイルをカスタムDockerfileとして使用できるようになりました。

  7. func.yamlファイルで、runtime:パラメータの値をruntime: dockerに変更します。

    たとえば、func.yamlファイルにruntime: javaが含まれている場合は、runtime: dockerに変更します。

  8. fn buildまたはfn deployコマンドを使用して、ファンクションを構築またはデプロイします。

OCI Functionsでは、カスタムDockerfile (Dockerfileという名前のファイル)の手順を使用して、ファンクションのDockerイメージを構築し、Dockerレジストリにプッシュします。fn buildまたはfn deployコマンドを使用すると、イメージにアプリケーションのシェイプとの互換性を保つために必要な依存関係が含まれることが保証されます(ファンクションを実行するコンピュート・アーキテクチャの指定を参照)。