🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 5

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

Ruby

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

Docker

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

Q&A

解決済

2回答

478閲覧

Docker-composeでRailsサーバを起動させる方法について

yuuki0218

総合スコア22

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 5

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

Ruby

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

Docker

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

0グッド

1クリップ

投稿2019/12/23 06:44

掲題の通り、起動方法について教えていただきたいです。

docker-compose.ymlとDokerfileを用いてRails(5.2)アプリケーション配置用のサーバをテスト運用しています。
今回、開発者の間でサーバの環境に差異が生まれないようにしたく、理想としてはdocker-compose up -d --buildとコマンド入力したら、localhostでRailsのサーバにアクセスできるようにしたいと考えています。(※基本的にDockerコンテナには入らない)

私自身Dockerが初心者なので、うまくわかっていないところがあり、実装に手間取っています。
実際に使用しているDockerコンテキストファイルは以下になります。

docker

1version: '3' 2services: 3 web: 4 image: "my-app-management" 5 container_name: "my-app-management" 6 build: . 7 volumes: 8 - ../../my-app-management:/opt/my-app-management 9 ports: 10 - "3000:3000" 11 privileged: true 12 command: /sbin/init 13 db: 14 image: postgres:9 15 container_name: db 16 ports: 17 - '5432:5432' 18 volumes: 19 - ./postgres:/var/lib/postgresql/data 20 restart: always 21 environment: 22 POSTGRES_USER: user 23

Dockerfile

1# Docker Image 2FROM centos:7 3 4# Ruby version 5ENV ruby_ver="2.6.5" 6 7# 必要なパッケージをインストール 8RUN yum -y update 9RUN yum -y install git make memcached autoconf curl wget bzip2 gcc-c++ openssl-devel postgresql-devel readline-devel zlib zlib-devel tar which 10 11# rbenvとruby-bundleをダウンロード 12RUN git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv 13RUN git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build 14 15# コマンドでrbenvが使えるように設定 16RUN echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh 17RUN echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile.d/rbenv.sh 18RUN echo 'eval "$(rbenv init --no-rehash -)"' >> /etc/profile.d/rbenv.sh 19 20# rbenvでrubyをインストール 21RUN source /etc/profile.d/rbenv.sh; rbenv install ${ruby_ver} 22RUN source /etc/profile.d/rbenv.sh; rbenv rehash 23RUN source /etc/profile.d/rbenv.sh; rbenv global ${ruby_ver} 24 25# bundlerのインストール 26RUN source /etc/profile.d/rbenv.sh; rbenv exec gem install bundler 27RUN source /etc/profile.d/rbenv.sh; rbenv rehash 28 29# my-app-managemen is bundle install && rails server boot 30WORKDIR /opt/my-app-management/ 31RUN /usr/local/rbenv/shims/bundle install --path vendor/bundle 32RUN /usr/local/rbenv/shims/bundle exec rails s -p 3000 -b 0.0.0.0.0 33 34WORKDIR / 35 36CMD ["/bin/bash"] 37

この状態でdocker-compose up -d --buildとすると以下のようなエラーが出力されます。

Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine. Could not locate Gemfile

Gemfileが無いとのことなので、DokerfileでmyappにWORKDIRした直後でlsコマンドなどでディレクトリを確認しましたが、確かにGemfileはありません。(どころか何もありません)

Step 16/18 : RUN ls -la && true ---> Running in 32d081cc4faf total 8 drwxr-xr-x 2 root root 4096 Dec 23 06:12 . drwxr-xr-x 1 root root 4096 Dec 23 06:12 ..

念のためエラーになった行をコメントアウトしてコンテナに入り、ディレクトリを確認してみました。

$ docker-compose exec web /bin/bash [root@9ac9072cfc1d /]# cd opt/my-app-managemen/ [root@9ac9072cfc1d my-app-managemen]# ll total 18 -rwxr-xr-x 1 root root 1577 Dec 20 08:15 Gemfile -rwxr-xr-x 1 root root 4633 Dec 20 08:15 Gemfile.lock -rwxr-xr-x 1 root root 3480 Dec 20 08:15 Gemfile.lock.RSPEC_v2_0_0 -rwxr-xr-x 1 root root 82 Dec 20 08:15 README -rwxr-xr-x 1 root root 284 Dec 20 08:15 Rakefile drwxrwxrwx 2 root root 0 Dec 20 08:15 app drwxrwxrwx 2 root root 0 Dec 20 08:15 autotest drwxrwxrwx 2 root root 0 Dec 20 08:15 bin drwxrwxrwx 2 root root 0 Dec 20 08:15 config -rwxr-xr-x 1 root root 158 Dec 20 08:15 config.ru drwxrwxrwx 2 root root 0 Dec 20 08:15 db drwxrwxrwx 2 root root 0 Dec 20 08:15 doc drwxrwxrwx 2 root root 0 Dec 20 08:16 docker drwxrwxrwx 2 root root 0 Dec 20 08:15 etc drwxrwxrwx 2 root root 0 Dec 20 08:15 lib drwxrwxrwx 2 root root 0 Dec 20 08:24 log drwxrwxrwx 2 root root 0 Dec 20 08:15 nbproject drwxrwxrwx 2 root root 0 Dec 20 08:15 public drwxrwxrwx 2 root root 0 Dec 20 08:15 release drwxrwxrwx 2 root root 0 Dec 20 08:15 script drwxrwxrwx 2 root root 0 Dec 20 08:15 spec drwxrwxrwx 2 root root 0 Dec 20 08:20 tmp drwxrwxrwx 2 root root 0 Dec 20 08:18 vendor

Gemfileはありました。。

ここから色々調べましたが、欲しい情報が見つからなかったため、お力をお借りしたいです。

一旦今わからないことは、Gemfileが無いといわれる原因がわかりません。
Dockerfileが実行されるのはbuildされるタイミングかと思いますが、その時点ではまだdocker-compose.ymlで実行されるマウントが完了していないということでしょうか?

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Dockerfileが実行されるのはbuildされるタイミングかと思いますが、その時点ではまだdocker-compose.ymlで実行されるマウントが完了していないということでしょうか?

はい、そのとおりです。

DockerにはBuildのフェーズとRunのフェーズがあって

  • Buildは「Dockerfileに書かれている情報からDockerイメージを作成する」フェーズ
  • RunはDockerイメージをプロセス(コンテナ)として実際に実行するフェーズ

という区分になっています。

このとき、Volumeとしてマウントするのは「実際に動くコンテナに対して」行われるため、Buildの時点ではVolumeのマウントは行われません。

依存関係をインストールしておくには、@kit494way さんの示すように、Gemfileなどのビルドに必要なをあらかじめCOPYしておく必要があります。

投稿2019/12/24 07:37

inductor

総合スコア428

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuki0218

2019/12/24 08:03

回答ありがとうございます。 一番聞きたい以下の部分に回答していただいたので、BAにさせていただきます。 >Dockerfileが実行されるのはbuildされるタイミングかと思いますが、その時点ではまだdocker-compose.ymlで実行されるマウントが完了していないということでしょうか? フェーズ切っての説明かなり分かりやすかったです。 BuildフェーズではVolumeのマウントされていないという動きがわかっておらず大分はまってしましました。。 @kit494wayも示していただいている通り、あらかじめ必要なファイルをADDorCOPYすることでbundle install自体は期待通りできました。 そのあとのRailsサーバ起動のコマンドは、docker-compose.ymlのcommandにて記述することで期待通りの動作を確認できました。 Dockerって単純に仮想マシンの簡易版みたいな使い方をしていて、書き方とかはネットからコピペで済ませていたのですが、改めて作りこもうとすると挙動を理解していないと厳しいですね。。楽しいですけど。 今回はほんとにありがとうございました。
guest

0

Gemfile をコピーしてないからではないですか?
Dockerfile と同じディレクトリに Gemfile があるという前提で、
WORKDIR /opt/my-app-management/ の直前に次のように記述してみてください。

dockerfile

1RUN mkdir /opt/my-app-management 2COPY Gemfile /opt/my-app-management/

ちなみに、 docker-compose.yml の volumes をみると上の階層のディレクトりをマウントしていますが、
Dockerfile よりも上の階層にあるファイルやディレクトリは COPY できないので、
Dockerfile と同じディレクトリに Gemfile をコピーして試してみてください。

投稿2019/12/23 13:30

kit494way

総合スコア317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問