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.
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.
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.
I came by the original details for this on a gist: https://gist.github.com/steinnes/1f8a1b44fed4b136005f