65542


Docker上(CentOS7)でrubyをインストールしています。

Dockerfile内の以下のコマンドで実行は正常にされたものの、

[code]

    RUN rbenv install 2.7.1
    
[/code]

ビルド後、コンテナのbashに入って`ruby -v`で確認すると、

[code]

    bash: ruby: command not found
    
[/code]

正常にインストールされていない状態で何が原因なのかわからない状況です。  
パスの設定か？と思いましたが、下記のソースコードの通り特に問題はない気がしています。

解決策を教えていただけると助かります。

# ソースコード

~/.bash_profile

[code]

    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
        . ~/.bashrc
    fi
    
    # User specific environment and startup programs
    
    PATH=$PATH:$HOME/bin
    
    export PATH
    export RBENV_ROOT="/usr/local/rbenv"
    export PATH="${RBENV_ROOT}/bin:${PATH}"
    eval "$(rbenv init --no-rehash -)"
    
[/code]

Dockerfile

[code]

    FROM centos:7.7.1908
    
    ENV LANG C.UTF-8
    ENV TZ Asia/Tokyo
    
    RUN yum -y update
    RUN yum install -y git tzdata libxml2-devel.x86_64 libcurl-devel.x86_64 gcc-c++.x86_64 glibc-devel.x86_64 mariadb-devel.x86_64 ImageMagick.x86_64 bzip2 make which
    
    RUN git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv
    RUN git clone https://github.com/rbenv/ruby-build.git /usr/local/rbenv/plugins/ruby-build
    
    RUN echo 'export RBENV_ROOT="/usr/local/rbenv"' >> ~/.bash_profile
    RUN echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> ~/.bash_profile
    RUN echo 'eval "$(rbenv init --no-rehash -)"' >> ~/.bash_profile
    ENV PATH=/usr/local/rbenv/bin:$PATH
    RUN ./usr/local/rbenv/plugins/ruby-build/install.sh
    
    RUN rbenv install 2.7.1
    RUN rbenv global 2.7.1
    
[/code]

dokcer-compose.yml

[code]

    version: '3'
    
    services:
      rails:
        build: .
        tty: true
        volumes:
          - .:/var/www
        working_dir: /var/www
        command: bash
        ports:
          - '3000:3000'
    
[/code]


CC BY-SA 4.0
2020-04-11T10:14:08.997
65536
2020-04-11T13:15:08.877
2020-04-11T10:55:38.767
3060
25223
question
ruby docker rbenv
Docker で Ruby (rbenv) のインストールがうまくいかない


コンテナの中でPATHを通すときはbash profileなどを使うのではなくDockerfileの中でENV命令を使います。

[code]

    ENV RBENV_ROOT="/usr/local/rbenv" PATH="${RBENV_ROOT}/bin:${PATH}"'
    
[/code]

といった具合でやってみると良さそうです。

ちなみに、CentOS上で動かしたいという明確な理由がない限りは、Rubyを動かすだけであれば公式のイメージでもよさそうですね！


CC BY-SA 4.0
2020-04-11T10:39:14.727
65537
2020-04-11T10:54:47.090
2020-04-11T10:54:47.090
3060
21329
65536
answer


`~/.bash_profile` は Bash がログインシェルとして起動された際に読み込まれるファイルですが、今回の Dockerfile
によって作られたイメージに `docker run -it` で入っても Bash は non-login shell として呼び出されているので
`~/.bash_profile` を読み込みません。このため `rbenv init` などが実行されておらず、`ruby` コマンドが PATH
から見えていません。

Docker で Ruby を使いたい場合、OS に拘らないのであれば公式イメージの
[ruby](https://hub.docker.com/_/ruby) を使い、CentOS に拘るのであれば `yum`
でバージョン指定しつつインストールするのがとりあえずは良いでしょう。rbenv を使いたくなるのは、`yum` で提供されていないような新しいバージョンの
Ruby を使いたい場合でしょうか。

rbenv を質問文のように使う場合、`~/.bash_profile` は使わず、環境変数は `ENV` で更新し、`rbenv init` は
`/etc/profile.d/rbenv.sh` に書く方法があります。

[code]

    ENV RBENV_ROOT="/usr/local/rbenv"
    ENV PATH="${RBENV_ROOT}/bin:${PATH}"
    RUN echo 'eval "$(rbenv init --no-rehash -)"' > /etc/profile.d/rbenv.sh
    
[/code]

※ CentOS 7 の場合、`/etc/profile.d/*.sh` は login shell として起動したとき `/etc/profile`
から読み込まれる他、non-login interactive shell として起動したとき `/etc/bashrc` から読み込まれます。

ただこれでも non-login non-interactive shell として実行された場合には反映されません。

Docker イメージとして使う場合 Ruby のバージョンを後から変更しないのが普通な気がするので、そうであれば eval するのではなく `rbenv
init` の内容を確かめて ENV 等で設定したり、[Kazuhiro NISHIYAMA
さんの回答](https://ja.stackoverflow.com/a/65542/19110)のように ruby-build
だけ使う方が良さそうです。


CC BY-SA 4.0
2020-04-11T10:58:08.380
65539
2020-04-11T13:15:08.877
2020-04-11T13:15:08.877
19110
19110
65536
answer


複数のバージョンの `ruby` を使いわける必要がないのなら、 `rbenv` は不要で `ruby-build` だけを使うのがオススメです。

[code]

    RUN git clone --depth=1 https://github.com/rbenv/ruby-build && PREFIX=/usr/local ./ruby-build/install.sh && rm -rf ruby-build
    RUN ruby-build 2.7.1 /usr/local
    
[/code]

のように `ruby-build` と `ruby` を `/usr/local` にインストールしてしまえば `PATH` を追加する必要もなくなります。


CC BY-SA 4.0
2020-04-11T13:02:28.023
65542
2020-04-11T13:02:28.023
14277
65536
answer