質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • Ruby

    8194questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7673questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Docker

    807questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

docker-compose upの際「exited with code 7」で停止する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 436

workr

score 150

docker for windows を使って Ruby on Rails のローカル環境を構築しようとしています。
docker-compose の build が正常に完了し、up してみたところ、「exited with code 7」と表示され停止しました。

ログには赤い文字でCould not find public_suffix-0.3.2 in any of the sourcesとあったのでGemfileに'public_suffix', '3.0.2'を追記し再度build, up してみたところ今度はCould not find addressable-2.5.2 in any of the sourcesというエラーで停止しました。

同様に追記して試すと、Could not find io-like-0.3.0 in any of the sourcesとなって同じ作業の繰り返しになります。

インストールしようしている何かのバージョンが新しすぎるのか何らかのコマンドで一括で最新版に更新できるのかよくわかりません。

現状のファイルはおおむね次のとおりです。

version: '3'

services:
  web:
    build: ./web
    command: bundle exec rails s -p 3000 -b 0.0.0.0
    ports:
      - '3000:3000'
    volumes:
      - ./app:/app
    stdin_open: true
    tty: true

web/Dockerfile

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential mysql-client nodejs
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app

Gemfile

source 'https://rubygems.org'
gem 'rails', '5.2.0'
gem 'mysql2'
gem 'public_suffix', '3.0.2'
gem 'addressable', '2.5.2'

dockerやruby自体不慣れであまり理解しきれていない状態です。どこかおかしなところがあるのでしょうか?
よろしくお願いいたします。


 追記

フォルダ階層は次のとおりです

app/    Ruby on Rails がインストールされています
db/     MySQL永続化のためのデータです
web/    Dockerfile, Gemfile, Gemfile.lock が格納されています
docker-compose.yml
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Ruby/Railsに不慣れであれば自分でGemfileを書いて差し込むよりrails newで生成する方がいいと思います。
過去に作ったことのあるRailsのDockerfileを貼っておきます。
個人的な趣味でdebianでなくalpineイメージですが・・・

FROM ruby:2.5-alpine

# install packages
RUN apk add -U --no-cache bash git

# install imagemagick6-dev for rmagick
# rmagickを使う場合
# RUN apk add --no-cache imagemagick6-dev

# install bundler
RUN gem install bundler

# install rails
RUN apk add --no-cache libxml2-dev libxslt-dev libstdc++ tzdata mariadb-client-libs nodejs \
            ca-certificates build-base mariadb-dev ruby-dev sqlite sqlite-dev mysql-dev
RUN gem install rails -v 5.2.0 --no-rdoc --no-ri

# create rails project
RUN rails new myproject -d mysql --bundle-skip
WORKDIR /myproject
# DB接続設定を挿入する場合
# COPY database.yml config
RUN bundle install --jobs=4 --path=vendor/bundle

CMD rails s -b 0.0.0.0

 追記

volumesをコメントアウトすると正常に起動し、ブラウザには「Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock'」というエラーが表示されていますが、これはRailsのエラー画面に見えるので成功しているようです。

仰る通りです。これはmysqlに接続すれば治るエラーなので大丈夫です。

alpine側にRailsがインストールされているようですがvolumesを外したのとADDをしていないのでローカル側のappフォルダは空の状態です。

仰る認識の通りです。
コンテナ起動→ボリュームマウントの順序で処理されるのでホスト側ボリュームが空だとコンテナ側も空になり、動きません。

RubyMineなどでのリモートデバッグ(?)が前提になるのでしょうか?

いえ、そんなことはありません。

色々方法はあるのですが、要はボリュームマウント時にホスト側にアプリケーションのソースが用意されている必要があるわけです。
私の Dockerfile を前提として説明します。
まず次のコマンドを順に実行して下さい。

docker build -t myrailsimage ./web # webディレクトリにrailsのDockerfileがある場合
docker run -d --rm --name myrailscontainer myrailsimage
docker cp myrailsimage:/myproject ./myproject
docker stop myrailscontainer

これでコンテナのrailsソースをホスト側に持ってこれます。

docker-compose.yml も合わせます。

volumes:
  - ./myproject:/myproject

この状態で docker-compose up を試してみて下さい。

私はMacユーザのため、Windowsの場合勝手が違う部分を含む可能性はありますが、ご留意下さい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 16:49

    回答有り難うございます。教えていただいたDockerfileの myproject の名前だけ変更して使ってみたのですが、buildには成功したもののupの際に「Could not find rake-12.3.1 in any of the sources」エラーが起き、exited with code 7で停止してしまいました。
    buildの段階では「Installing rake 12.3.1」というログが残っているのですが何が原因と考えられるでしょうか?

    キャンセル

  • 2018/06/14 21:05

    あれ、そうでしたか。ちょっとこちらでも動作確認してみますのでお待ち下さい。

    キャンセル

  • 2018/06/14 21:46

    こちらの環境で試したところ大丈夫でした。一度docker-compose.ymlのvolumesを削除するかコメントアウトして試してみて下さい。

    キャンセル

  • 2018/06/15 12:11

    御返事ありがとうございます。「build --no-cache」を試したところログ上のエラーはなくなりましたが「exited with code 0」で停止するように変化しました。

    volumesをコメントアウトすると正常に起動し、ブラウザには「Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock'」というエラーが表示されていますが、これはRailsのエラー画面に見えるので成功しているようです。

    alpine側にRailsがインストールされているようですがvolumesを外したのとADDをしていないのでローカル側のappフォルダは空の状態です。RubyMineなどでのリモートデバッグ(?)が前提になるのでしょうか?

    フォルダ階層が怪しい気がするので追記に構造を記述しました。もしなにかお気付きの点がありましたらよろしくお願いいたします。

    キャンセル

  • 2018/06/15 13:22

    ご報告頂いた内容は私の想定通りですので、ボリュームマウントした上で動かす方法を追記致しました。

    キャンセル

  • 2018/06/15 14:56 編集

    教えていただいた方法でローカルのプロジェクトフォルダと同期させることができました。詳細な解説ありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • Ruby

    8194questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7673questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Docker

    807questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです