Home > Software design >  How to install ruby 3.1.2 in an Ubuntu Docker container?
How to install ruby 3.1.2 in an Ubuntu Docker container?

Time:12-07

I tried:

if ! command -v ruby &> /dev/null
then
    # - proverbot's version
    # First, install Ruby, as that is for some reason required to build
    # the "system" project
#    git clone https://github.com/rbenv/ruby-build.git ~/ruby-build
#    mkdir -p ~/.local
#    PREFIX=~/.local ./ruby-build/install.sh
#    ~/.local/ruby-build 3.1.2 ~/.local/

    # - u-pycoq's version
#    sudo apt-get install ruby-full
    sudo apt-get install rbenv
    rbenv init
    eval "$(rbenv init - bash)"
    echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc

    sudo apt-get install ruby-build
#    ruby-build 3.1.2
    rbenv install 3.1.2

    rbenv global 3.1.2
    ruby -v

else
    echo "Error: failed to install ruby"
fi

but I get my ruby build is not up to date perhaps but when I install it -- it is up to date. Therefore, why is the proverbot's attempt 3.1.2 if it doesn't exist?

inspired from: https://superuser.com/questions/340490/how-to-install-and-use-different-versions-of-ruby


Seems it works with 2.7.1 but not with 3.1.2

    sudo apt-get install rbenv
    rbenv init
    eval "$(rbenv init - bash)"
    echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc

    sudo apt-get install ruby-build
#    mkdir -p ~/.local
#    PREFIX=~/.local
#    sh ~/ruby-build/install.sh

    mkdir -p ~/.local
    ruby-build 2.7.1 ~/.local
    rbenv global 2.7.1
#    ruby-build 2.3.1p112 ~/.local/
#    ruby-build 3.1.2 ~/.local/
#    rbenv global 3.1.2

    ruby -v
bot@513314bdda2a:~/ruby-build$ ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [aarch64-linux-gnu]

Main command that fails

I think this is the main command that fails after rbenv and ruby-build are installed:

rbenv install 3.1.2

with

ruby-build: definition not found: 3.1.2

See all available versions with `rbenv install --list.

If the version you need is missing, try upgrading ruby-build.` will add it to the question.

Might my version of ubuntu be the issue?

I tried it in a different server outside my docker container and ruby works. In the docker container it says it's:

bot@513314bdda2a:~/ruby-build$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:    11
Codename:   bullseye

is that an issue?


I tried updating ruby-build

I ran sudo apt-get update then sudo apt-get upgrade ruby-build then mkdir -p ~/.local then ruby-build 3.1.2 ~/.local/ and the error is ruby-build: definition not found: 3.1.2


Tried a bunch of ubuntus but failed

#!/usr/bin/env bash

# - get ubuntu version for ubuntu img
#docker run -it --rm ubuntu:20.04 /bin/bash
docker run -it --rm ubuntu:18.04 /bin/bash
apt-get update && apt-get install -y lsb-release && apt-get clean all
lsb_release -a
#apt-get install git

apt-get update
apt-get upgrade ruby-build

apt-get install rbenv
apt-get install ruby-build
rbenv install 3.1.2

# - get ubuntu version for miniconda3 docker img
docker run -it --rm continuumio/miniconda3:latest /bin/bash
#sudo apt-get install lsb-release
#apt-get install lsb-release
apt-get update && apt-get install -y lsb-release && apt-get clean all
lsb_release -a

Output of ruby-build https://gist.github.com/brando90/8a40e83df107f5a915ba105d9fb0121c

$ ruby-build --definitions
1.8.5-p52
1.8.5-p113
...

gist is that all 3.x.x are missing.


Tried updating ruby-build manually but failed

I did do:

git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

then

git -C "$(rbenv root)"/plugins/ruby-build pull

then I installed 3.1.2 with rbenv it seemed to succeed but then ruby --version doesn't seem right?

bot@e3a50e4f740f:~$ rbenv install 3.1.2
To follow progress, use 'tail -f /tmp/ruby-build.20221207002433.1304.log' or pass --verbose
Downloading ruby-3.1.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.2.tar.gz
Installing ruby-3.1.2...



Installed ruby-3.1.2 to /home/bot/.rbenv/versions/3.1.2

bot@e3a50e4f740f:~$
bot@e3a50e4f740f:~$
bot@e3a50e4f740f:~$
bot@e3a50e4f740f:~$ ruby --version
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [aarch64-linux-gnu]
bot@e3a50e4f740f:~$ rbenv global 3.1.2
bot@e3a50e4f740f:~$ ruby --version
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [aarch64-linux-gnu]

Option: Official rbenv instructions

alas, that didn't work :frowning:

$ rbenv install 3.1.2
rbenv: no such command `install'

I did:

mkdir ~/.rbenv
cd ~/.rbenv
git clone https://github.com/rbenv/rbenv.git ~/.rbenv

echo 'eval "$(~/.rbenv/bin/rbenv init - bash)"' >> ~/.bashrc

bash
# exec $SHELL

rbenv install 3.1.2

using the official instructions: https://github.com/rbenv/rbenv#basic-git-checkout


Probably best to use a ruby docker container? But how do I get one with the specific version I want 3.1.2 (or any specific version)?

all options I tried to install ruby on a docker container with specific version 3.1.2, likely better to just use a ruby image instead, any recommendations for 3.1.2?


refs:

CodePudding user response:

This doesn't work on an ubuntu docker container which is the title of the question, but it at least worked on the HPC with Ubuntu I was using, so it can still be useful for future readers, a real anser on a ubuntu docker container is still needed and wanted

# - install rbenv for installing ruby
mkdir ~/.rbenv
cd ~/.rbenv
git clone https://github.com/rbenv/rbenv.git .

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc.user
echo 'eval "$(rbenv init -)"' >> ~/.bashrc.user
exec $SHELL
bash
source ~/.bashrc.user

rbenv -v

# - install ruby-build
mkdir ~/.ruby-build
cd ~/.ruby-build
git clone https://github.com/rbenv/ruby-build.git .

export PATH="$HOME/.ruby-build/bin:$PATH"
echo 'export PATH="$HOME/.ruby-build/bin:$PATH"' >> ~/.bashrc.user
exec $SHELL
bash
source ~/.bashrc.user

ruby-build --version

# - install ruby without sudo -- now that ruby build was install
mkdir -p ~/.local
#    ruby-build 3.1.2 ~/.local/
rbenv install 3.1.2
rbenv global 3.1.2

ruby -v
which ruby

CodePudding user response:

Given the giant effort I've put so far I think the best is just to re-build the docker image from scratch starting from all the docker images you need. For me I need to start from these:

FROM continuumio/miniconda3
# FROM --platform=linux/amd64 continuumio/miniconda3
#FROM ubuntu:20.04
#FROM ubuntu:18.04
FROM ruby:3.1.2

but re-building the image I tested to see if the right ruby image was available once I started the ruby 3.1.2 container (if you want a different one I assume going to the docker website for ruby works or try different version tags or do latest). Output:

(meta_learning) brandomiranda~ ❯ docker run -it --rm ruby:3.1.2 bash
Unable to find image 'ruby:3.1.2' locally
3.1.2: Pulling from library/ruby
077c13527d40: Pull complete
a3e29af4daf3: Pull complete
3d7b1480fa4d: Pull complete
426e8acfed2a: Pull complete
7301bf329e1e: Pull complete
1e6ce022773b: Pull complete
08fd3b7f7d99: Pull complete
2a797222ff77: Pull complete
Digest: sha256:7681a3d37560dbe8ff7d0a38f3ce35971595426f0fe2f5709352d7f7a5679255
Status: Downloaded newer image for ruby:3.1.2
root@70d03f6408cd:/# ruby --version
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [aarch64-linux]
  • Related