Enable swap file on an Elastic Beanstalk Docker Host
The Elastic Beanstalk Docker setup works by building the docker image on each host as part of the deployment process, rather than pulling a built image from a repository.
This means you don’t need to worry about configuring extra build steps and configuring authentication, but if you are running light weight hosts you might not have enough memory to actually build the image. Since the new image is built on the server while the current container is running you might find the initial deploy works when there is nothing else running, but then redeploying the app fails.
As a rule of thumb, if something works on your local machine, and it doesn’t work on a virtual server that doesn’t have a swap file set up, try adding one.
To set up a swap file, we can take advantage of the run time hooks Elastic Beanstalk offers - but documents poorly - and insert a script that will run before the docker run phase.
.ebextensions/swap.config
commands:
create_pre_dir:
command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/pre"
ignoreErrors: true
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/00_setup_swap.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
SWAPFILE=/var/swapfile
SWAP_MEGABYTES=4096
if [ -f $SWAPFILE ]; then
echo "Swapfile $SWAPFILE found, skipping"
exit 0;
fi
/bin/dd if=/dev/zero of=$SWAPFILE bs=1M count=$SWAP_MEGABYTES
/bin/chmod 600 $SWAPFILE
/sbin/mkswap $SWAPFILE
/sbin/swapon $SWAPFILE
exit 0;
This works by adding the script into /opt/elasticbeanstalk/hooks/appdeploy/pre
which is then picked up by Elastic Beanstalk and executed before deploying the app. pre
indicating the before element, and appdeploy
been the deployment stage.
Next steps
In theory, you don’t want to be using the swap file when the image is running, so you could remove the swap file once the image is built.
Read More In The Official AWS Docs
The deployment stages and hooks that you can use are documented on AWS at https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html if you want to expand on this pattern.
Sources
I came by the original details for this on a gist: https://gist.github.com/steinnes/1f8a1b44fed4b136005f