How to correctly install RVM in Docker?

This is what I have in my Dockerfile:

RUN gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
RUN curl -L https://get.rvm.io | bash -s stable
RUN /bin/bash -l -c "rvm requirements"
RUN /bin/bash -l -c "rvm install 2.3.3"

Works just fine, however, when I start the container, I see this:

  • Supervisor is not started into my docker container (Laravel project)
  • Push to port-forwarded docker registry
  • Opening Port in Docker Container
  • Create images from same Dockerfile
  • Mount remote docker instance to my OSX file system
  • Docker container DHCP like bridged VirtualBox
  • $ docker -it --rm myimage /bin/bash
    /root# ruby --version
    ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
    /root# /bin/bash -l -c "ruby --version"
    ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
    

    Obviously, this is not what I want. As far as I understand, the problem is that bash doesn’t run /etc/profile by default. That’s why Ruby is not coming from the RVM installation. How can I fix that?

  • Container as volume pattern in windows/vagrant env
  • TravisCI Docker Permissions
  • Docker communication to hardware on host
  • Docker swarm with a custom network
  • Gitlab-ci configure docker runner for deployment with SSH keys
  • Dockerized Nginx upstream error serving separate Docker container with Flask/uWSGI app
  • One Solution collect form web for “How to correctly install RVM in Docker?”

    Long story short:

    docker -it --rm myimage /bin/bash command does not start bash as a login shell.

    Explanation:

    When you run $ docker -it --rm myimage /bin/bash it’s invoke bash without the -l option which make bash act as if it had been invoked as a login shell, rvm initializations depends on the source-ing /path/to/.rvm/scripts/rvm or /etc/profile.d/rvm.sh and that initialization is in .bash_profile or .bashrc or any other initialization scripts.

    How can I fix that?

    If you want always have the ruby from rvm add -l option.

    Here is a Dockerfile with installed ruby by rvm:

    FROM debian
    
    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get update -q && \
        apt-get install -qy curl ca-certificates gnupg2 build-essential --no-install-recommends && apt-get clean
    
    RUN gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
    RUN curl -sSL https://get.rvm.io | bash -s
    RUN /bin/bash -l -c ". /etc/profile.d/rvm.sh && rvm install 2.3.3"
    # The entry point here is an initialization process, 
    # it will be used as arguments for e.g.
    # `docker run` command 
    ENTRYPOINT ["/bin/bash", "-l", "-c"]
    

    Run the container:

    ➠ docker_templates : docker run -ti --rm rvm 'ruby -v'
    ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
    ➠ docker_templates : docker run -ti --rm rvm 'rvm -v'
    rvm 1.29.1 (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io/]
    ➠ docker_templates : docker run -ti --rm rvm bash
    root@efa1bf7cec62:/# rvm -v
    rvm 1.29.1 (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io/]
    root@efa1bf7cec62:/# ruby -v
    ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
    root@efa1bf7cec62:/# 
    
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.