<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cristian Castaño</title>
    <description>The latest articles on DEV Community by Cristian Castaño (@cristiancastano852).</description>
    <link>https://dev.to/cristiancastano852</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3188393%2F3da2d412-2c02-4a1f-addd-65cb7f00737c.png</url>
      <title>DEV Community: Cristian Castaño</title>
      <link>https://dev.to/cristiancastano852</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cristiancastano852"/>
    <language>en</language>
    <item>
      <title>How to Use IMAP Extension with PHP 8.4 on AWS Lambda using Bref</title>
      <dc:creator>Cristian Castaño</dc:creator>
      <pubDate>Fri, 16 Jan 2026 22:42:51 +0000</pubDate>
      <link>https://dev.to/cristiancastano852/how-to-use-imap-extension-with-php-84-on-aws-lambda-using-bref-4773</link>
      <guid>https://dev.to/cristiancastano852/how-to-use-imap-extension-with-php-84-on-aws-lambda-using-bref-4773</guid>
      <description>&lt;h1&gt;
  
  
  How to Use IMAP Extension with PHP 8.4 on AWS Lambda using Bref
&lt;/h1&gt;

&lt;p&gt;If you've ever tried to use the IMAP extension with PHP 8.4 on AWS Lambda using &lt;a href="https://bref.sh" rel="noopener noreferrer"&gt;Bref&lt;/a&gt;, you've probably hit a wall. The IMAP extension isn't available as a pre-built layer for PHP 8.4, and compiling PHP extensions for Lambda's Amazon Linux 2 environment can be tricky.&lt;/p&gt;

&lt;p&gt;In this article, I'll show you how I solved this problem using &lt;strong&gt;Docker multi-stage builds&lt;/strong&gt; to compile the IMAP extension and deploy it with Bref.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The Problem&lt;/li&gt;
&lt;li&gt;The Solution: Docker Multi-Stage Builds&lt;/li&gt;
&lt;li&gt;Understanding the Dockerfile&lt;/li&gt;
&lt;li&gt;Complete Dockerfiles&lt;/li&gt;
&lt;li&gt;Serverless Configuration&lt;/li&gt;
&lt;li&gt;How It All Works Together&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Problem &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Bref provides excellent PHP runtimes for AWS Lambda, including many common extensions through &lt;a href="https://github.com/brefphp/extra-php-extensions" rel="noopener noreferrer"&gt;bref/extra-php-extensions&lt;/a&gt;. However, the IMAP extension for PHP 8.4 isn't available as a pre-built layer.&lt;/p&gt;

&lt;p&gt;Why? The IMAP extension has several system-level dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;c-client&lt;/code&gt; library (uw-imap)&lt;/li&gt;
&lt;li&gt;Kerberos libraries&lt;/li&gt;
&lt;li&gt;OpenSSL development files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These dependencies need to be compiled specifically for Amazon Linux 2, which is Lambda's underlying operating system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Docker Multi-Stage Builds &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of using Lambda layers, we'll use &lt;strong&gt;Docker container images&lt;/strong&gt; for our Lambda functions. This approach gives us full control over the environment and allows us to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compile the IMAP extension&lt;/strong&gt; in a build stage using Bref's build image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the compiled extension&lt;/strong&gt; to the final runtime image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy as container images&lt;/strong&gt; to AWS ECR&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key insight is that Bref provides &lt;code&gt;bref/build-php-84&lt;/code&gt; - a Docker image specifically designed for compiling PHP extensions that will work on Lambda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Dockerfile &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Let's break down what each part of the Dockerfile does:&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1: Build the IMAP Extension
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;bref/build-php-84:2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ext&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This uses Bref's build image, which contains all the tools needed to compile PHP extensions for Lambda's environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;amazon-linux-extras
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 amazon-linux-extras &lt;span class="nb"&gt;install &lt;/span&gt;epel &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;uw-imap-devel krb5-devel openssl-devel libc-client-devel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we install the IMAP dependencies. The &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; is necessary because of how libraries are organized in the Bref build image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;pecl download imap-1.0.3 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; imap-1.0.3.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We download the IMAP extension from PECL. Note that we use version &lt;code&gt;1.0.3&lt;/code&gt; which is compatible with PHP 8.4.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib phpize &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib ./configure &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-imap&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-kerberos&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-imap-ssl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-libdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lib64 &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-I/usr/include"&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-L/lib64"&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib make &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This compiles the extension with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IMAP support&lt;/li&gt;
&lt;li&gt;Kerberos authentication support&lt;/li&gt;
&lt;li&gt;SSL/TLS support for secure IMAP connections
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;php-config &lt;span class="nt"&gt;--extension-dir&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/imap.so /tmp/imap.so &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'extension=imap.so'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/ext-imap.ini &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /tmp/extension-libs &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; php /bref/lib-copy/copy-dependencies.php /tmp/imap.so /tmp/extension-libs &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/extension-libs/libssl.so.3 /tmp/extension-libs/libcrypto.so.3 &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/extension-libs/libz.so.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is crucial! We:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy the compiled &lt;code&gt;imap.so&lt;/code&gt; extension&lt;/li&gt;
&lt;li&gt;Create a PHP ini file to load it&lt;/li&gt;
&lt;li&gt;Use Bref's &lt;code&gt;copy-dependencies.php&lt;/code&gt; to find and copy all required shared libraries&lt;/li&gt;
&lt;li&gt;Remove libraries that are already present in the runtime (to avoid conflicts)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Stage 2: The Runtime Image
&lt;/h3&gt;

&lt;p&gt;The second stage uses the appropriate Bref runtime image and copies our compiled extension.&lt;/p&gt;

&lt;h2&gt;
  
  
  Complete Dockerfiles &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Here are the complete Dockerfiles for different Lambda function types:&lt;/p&gt;

&lt;h3&gt;
  
  
  Dockerfile.web (for HTTP requests via API Gateway)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;bref/build-php-84:2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ext&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;amazon-linux-extras
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 amazon-linux-extras &lt;span class="nb"&gt;install &lt;/span&gt;epel &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;uw-imap-devel krb5-devel openssl-devel libc-client-devel

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /tmp&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;pecl download imap-1.0.3 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; imap-1.0.3.tgz

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /tmp/imap-1.0.3&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib phpize &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib ./configure &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-imap&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-kerberos&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-imap-ssl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-libdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lib64 &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-I/usr/include"&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-L/lib64"&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib make &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;php-config &lt;span class="nt"&gt;--extension-dir&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/imap.so /tmp/imap.so &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'extension=imap.so'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/ext-imap.ini &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /tmp/extension-libs &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; php /bref/lib-copy/copy-dependencies.php /tmp/imap.so /tmp/extension-libs &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/extension-libs/libssl.so.3 /tmp/extension-libs/libcrypto.so.3 &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/extension-libs/libz.so.1

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; bref/php-84-fpm:2&lt;/span&gt;

&lt;span class="c"&gt;# Copy the IMAP extension and its dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=ext /tmp/imap.so /opt/bref/extensions/imap.so&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=ext /tmp/ext-imap.ini /opt/bref/etc/php/conf.d/ext-imap.ini&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=ext /tmp/extension-libs/ /opt/lib/&lt;/span&gt;

&lt;span class="c"&gt;# Add other extensions from bref/extra-php-extensions if needed&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=bref/extra-redis-php-84:1 /opt /opt/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=bref/extra-ssh2-php-84:1 /opt /opt/&lt;/span&gt;

&lt;span class="c"&gt;# Copy your application code&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /var/task&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["public/index.php"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dockerfile.cli (for Artisan commands and scheduled tasks)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;bref/build-php-84:2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ext&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;amazon-linux-extras
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 amazon-linux-extras &lt;span class="nb"&gt;install &lt;/span&gt;epel &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;uw-imap-devel krb5-devel openssl-devel libc-client-devel

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /tmp&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;pecl download imap-1.0.3 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; imap-1.0.3.tgz

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /tmp/imap-1.0.3&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib phpize &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib ./configure &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-imap&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-kerberos&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-imap-ssl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-libdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lib64 &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-I/usr/include"&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-L/lib64"&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib make &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;php-config &lt;span class="nt"&gt;--extension-dir&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/imap.so /tmp/imap.so &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'extension=imap.so'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/ext-imap.ini &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /tmp/extension-libs &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; php /bref/lib-copy/copy-dependencies.php /tmp/imap.so /tmp/extension-libs &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/extension-libs/libssl.so.3 /tmp/extension-libs/libcrypto.so.3 &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/extension-libs/libz.so.1

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; bref/php-84-console:2&lt;/span&gt;

&lt;span class="c"&gt;# Copy the IMAP extension and its dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=ext /tmp/imap.so /opt/bref/extensions/imap.so&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=ext /tmp/ext-imap.ini /opt/bref/etc/php/conf.d/ext-imap.ini&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=ext /tmp/extension-libs/ /opt/lib/&lt;/span&gt;

&lt;span class="c"&gt;# Add other extensions from bref/extra-php-extensions if needed&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=bref/extra-redis-php-84:1 /opt /opt/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=bref/extra-ssh2-php-84:1 /opt /opt/&lt;/span&gt;

&lt;span class="c"&gt;# Copy your application code&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /var/task&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["artisan"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dockerfile.queue (for SQS queue workers)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;bref/build-php-84:2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ext&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;amazon-linux-extras
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 amazon-linux-extras &lt;span class="nb"&gt;install &lt;/span&gt;epel &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib:/lib64 yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;uw-imap-devel krb5-devel openssl-devel libc-client-devel

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /tmp&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;pecl download imap-1.0.3 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; imap-1.0.3.tgz

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /tmp/imap-1.0.3&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib phpize &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib ./configure &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-imap&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-kerberos&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-imap-ssl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nt"&gt;--with-libdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lib64 &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-I/usr/include"&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-L/lib64"&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/lib64:/lib make &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;php-config &lt;span class="nt"&gt;--extension-dir&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/imap.so /tmp/imap.so &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'extension=imap.so'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/ext-imap.ini &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /tmp/extension-libs &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; php /bref/lib-copy/copy-dependencies.php /tmp/imap.so /tmp/extension-libs &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/extension-libs/libssl.so.3 /tmp/extension-libs/libcrypto.so.3 &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/extension-libs/libz.so.1

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; bref/php-84:2&lt;/span&gt;

&lt;span class="c"&gt;# Copy the IMAP extension and its dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=ext /tmp/imap.so /opt/bref/extensions/imap.so&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=ext /tmp/ext-imap.ini /opt/bref/etc/php/conf.d/ext-imap.ini&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=ext /tmp/extension-libs/ /opt/lib/&lt;/span&gt;

&lt;span class="c"&gt;# Add other extensions from bref/extra-php-extensions if needed&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=bref/extra-redis-php-84:1 /opt /opt/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=bref/extra-ssh2-php-84:1 /opt /opt/&lt;/span&gt;

&lt;span class="c"&gt;# Copy your application code&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /var/task&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["Bref\\LaravelBridge\\Queue\\QueueHandler"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key differences between the Dockerfiles:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dockerfile&lt;/th&gt;
&lt;th&gt;Base Runtime Image&lt;/th&gt;
&lt;th&gt;CMD&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.web&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bref/php-84-fpm:2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;public/index.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP requests via API Gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.cli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bref/php-84-console:2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;artisan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CLI commands, scheduled tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.queue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bref/php-84:2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;QueueHandler&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SQS queue processing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Serverless Configuration &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Here's how to configure &lt;code&gt;serverless.yml&lt;/code&gt; to use these Docker images with AWS ECR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-laravel-app&lt;/span&gt;

&lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws&lt;/span&gt;
  &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${opt:stage, 'dev'}&lt;/span&gt;
  &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;provided.al2&lt;/span&gt;

  &lt;span class="c1"&gt;# Optional: Configure API Gateway&lt;/span&gt;
  &lt;span class="na"&gt;httpApi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${ssm:/my-app/apigw_id}&lt;/span&gt;  &lt;span class="c1"&gt;# Or create a new one&lt;/span&gt;

  &lt;span class="c1"&gt;# Environment variables for your Lambda functions&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;APP_ENV&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:provider.stage}&lt;/span&gt;
    &lt;span class="c1"&gt;# Add your other environment variables here&lt;/span&gt;

  &lt;span class="c1"&gt;# VPC configuration (if needed)&lt;/span&gt;
  &lt;span class="na"&gt;vpc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;securityGroupIds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sg-xxxxxxxxx&lt;/span&gt;
    &lt;span class="na"&gt;subnetIds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;subnet-xxxxxxxx&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;subnet-yyyyyyyy&lt;/span&gt;

  &lt;span class="c1"&gt;# S3 bucket for Serverless deployments&lt;/span&gt;
  &lt;span class="na"&gt;deploymentBucket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-serverless-deployments&lt;/span&gt;

  &lt;span class="c1"&gt;# ECR image definitions - this is the key part!&lt;/span&gt;
  &lt;span class="na"&gt;ecr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app-web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./&lt;/span&gt;
        &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile.web&lt;/span&gt;
      &lt;span class="na"&gt;app-cli&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./&lt;/span&gt;
        &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile.cli&lt;/span&gt;
      &lt;span class="na"&gt;app-queue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./&lt;/span&gt;
        &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile.queue&lt;/span&gt;

&lt;span class="c1"&gt;# Exclude unnecessary files from the Docker build context&lt;/span&gt;
&lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;patterns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!node_modules/**'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!public/storage'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!storage/**'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!tests/**'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!.git/**'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!vendor/**/test/**'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!vendor/**/tests/**'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!vendor/**/docs/**'&lt;/span&gt;

&lt;span class="na"&gt;functions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Web function - handles HTTP requests&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:provider.stage}-${self:service}-web&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-web&lt;/span&gt;
    &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;28&lt;/span&gt;
    &lt;span class="na"&gt;events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;httpApi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;

  &lt;span class="c1"&gt;# Artisan function - for CLI commands and scheduled tasks&lt;/span&gt;
  &lt;span class="na"&gt;artisan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:provider.stage}-${self:service}-artisan&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-cli&lt;/span&gt;
    &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;
    &lt;span class="na"&gt;events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Run Laravel scheduler every minute&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rate(1 minute)&lt;/span&gt;
          &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;"schedule:run"'&lt;/span&gt;

  &lt;span class="c1"&gt;# Queue worker - processes SQS messages&lt;/span&gt;
  &lt;span class="na"&gt;queue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:provider.stage}-${self:service}-queue&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-queue&lt;/span&gt;
    &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
    &lt;span class="na"&gt;events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;sqs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;arn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:sqs:us-east-1:123456789:my-queue&lt;/span&gt;

&lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./vendor/bref/bref&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./vendor/bref/extra-php-extensions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Important Configuration Notes
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ECR Images Section&lt;/strong&gt;: The &lt;code&gt;provider.ecr.images&lt;/code&gt; section tells Serverless to build Docker images and push them to ECR automatically during deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function Image Reference&lt;/strong&gt;: Each function uses &lt;code&gt;image.name&lt;/code&gt; to reference the ECR image defined above, instead of using &lt;code&gt;handler&lt;/code&gt; and &lt;code&gt;layers&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Package Patterns&lt;/strong&gt;: Since we're building Docker images, the package patterns help reduce the Docker build context size, making builds faster.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How It All Works Together &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;When you run &lt;code&gt;serverless deploy&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Serverless builds the Docker images&lt;/strong&gt; using the specified Dockerfiles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images are pushed to AWS ECR&lt;/strong&gt; (Elastic Container Registry) in your account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda functions are created/updated&lt;/strong&gt; to use these container images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway, SQS triggers, and schedules&lt;/strong&gt; are configured&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The multi-stage build ensures that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The build dependencies (compilers, dev packages) stay in the build stage&lt;/li&gt;
&lt;li&gt;Only the compiled extension and runtime dependencies go to the final image&lt;/li&gt;
&lt;li&gt;The final image is as small and efficient as possible&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Locally
&lt;/h2&gt;

&lt;p&gt;You can test your Docker images locally before deploying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build the CLI image&lt;/span&gt;
docker build &lt;span class="nt"&gt;-f&lt;/span&gt; Dockerfile.cli &lt;span class="nt"&gt;-t&lt;/span&gt; my-app-cli &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Test that IMAP is loaded&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; my-app-cli php &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;imap

&lt;span class="c"&gt;# Run an artisan command&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; my-app-cli php artisan list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Using Docker multi-stage builds with Bref is a powerful solution when you need PHP extensions that aren't available as pre-built layers. This approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Works with any PHP extension&lt;/strong&gt; - not just IMAP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keeps your images small&lt;/strong&gt; - build dependencies don't ship to production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is reproducible&lt;/strong&gt; - the same Dockerfile builds the same image every time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrates seamlessly&lt;/strong&gt; with Serverless Framework and AWS ECR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is using Bref's &lt;code&gt;bref/build-php-*&lt;/code&gt; images for compilation, which ensures compatibility with Lambda's Amazon Linux 2 environment.&lt;/p&gt;

&lt;p&gt;If you found this helpful, feel free to reach out with questions or share your own experiences with PHP on Lambda!&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bref.sh/docs/" rel="noopener noreferrer"&gt;Bref Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/u/bref" rel="noopener noreferrer"&gt;Bref Docker Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/brefphp/extra-php-extensions" rel="noopener noreferrer"&gt;bref/extra-php-extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.serverless.com/framework/docs/providers/aws/guide/functions#ecr-images" rel="noopener noreferrer"&gt;Serverless Framework - ECR Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pecl.php.net/package/imap" rel="noopener noreferrer"&gt;PECL IMAP Extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Connect with me:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/cristiancastano852/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>programming</category>
    </item>
    <item>
      <title>bref</title>
      <dc:creator>Cristian Castaño</dc:creator>
      <pubDate>Thu, 05 Jun 2025 19:57:22 +0000</pubDate>
      <link>https://dev.to/cristiancastano852/bref-2p7l</link>
      <guid>https://dev.to/cristiancastano852/bref-2p7l</guid>
      <description></description>
    </item>
  </channel>
</rss>
