How to install a different ruby version on a php container


In a php/node/… application container you sometimes also need ruby. By default, the version we install is 2.3.3 but it could be you need a different version


This article describes how to install a different ruby version in your application container. Note that this only applies to application container which are not ruby containers. For ruby containers, simply change the container type as described in the documentation

0. Platform.Sh project

We need a Platform.Sh project to work with. But I’m assuming you already have that set up.

1. Installing ruby

We are going to leverage to save us the hassle of compiling it ourselves.

Create a file and commit it to your repository.

run() {
    # Run the compilation process.
    cd $PLATFORM_CACHE_DIR || exit 1;

    if [ ! -d "${PLATFORM_CACHE_DIR}/.linuxbrew/opt/ruby@$1" ]; then
        echo "Ruby not found in cache, installing"
        install_ruby $1

    write_profile $1


copy_lib_to_cache() {
    echo "Copy to cache..."
    rsync -ahr $PLATFORM_APP_DIR/.linuxbrew $PLATFORM_CACHE_DIR

copy_lib_from_cache() {
    echo "Copy from cache..."
    rsync -ahr $PLATFORM_CACHE_DIR/.linuxbrew $PLATFORM_APP_DIR

write_profile() {
    touch ~/.environment
    echo "export PATH=\"/app/.linuxbrew/bin:/app/.linuxbrew/opt/ruby@$1/bin:$PATH\"" >> ~/.environment
    echo 'eval $(/app/.linuxbrew/bin/brew shellenv)' >>~/.environment
    ruby_dir=$(ls ~/.linuxbrew/Cellar/ruby@$1)
    echo "export LD_LIBRARY_PATH=/app/.linuxbrew/Cellar/ruby@$1/$ruby_dir/lib/" >> ~/.environment

install_brew() {
    echo "Installing homebrew"
    mkdir -p /app/.linuxbrew

    echo "Downloading tarball from master repository"
    curl -SsL -o brew.tar.gz
    echo "Unpacking into .linuxbrew folder"
    tar xzf brew.tar.gz --strip-components 1 -C /app/.linuxbrew/
    rm brew.tar.gz

    eval $(/app/.linuxbrew/bin/brew shellenv)
    brew analytics off


install_ruby() {
    echo "Installing ruby with command: brew install ruby@$1"
    brew install ruby@"$1"
    rename 's/.reinstall//' /app/.linuxbrew/Cellar/ruby@$1/*.reinstall

ensure_environment() {
    # If not running in a build environment, do nothing.
    if [ -z "${PLATFORM_CACHE_DIR}" ]; then
        echo "Not running in a build environment.  Aborting installation."
        exit 0;

ensure_arguments() {
    # If no version was specified, don't try to guess.
    if [ -z $1 ]; then
        echo "No version specified. You must specify a tagged version on the command line."
        exit 1;
    echo "Version was specified as $1"

ensure_arguments "$1"
run "$1"

3. Add the install to the build hook

We can now call the bash script from our build hook. You have to pass in the version you want to install to the script.

# The hooks executed at various points in the life cycle of the application.
    build: |
        set -e
        bash 2.6

4. Verify installation

platform ssh 'ruby -v'

This should return something like this:

ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]

Build cache

The building of ruby and brew is fairly slow. But the script utilizes the platform_build_cache to speed subsequent builds up. If you decide to upgrade the version, run platform project:clear-build-cache


It’s a bit of work to get it working, but since this case is not common, the extra work is justified.