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

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

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Ruby on Rails

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

Docker

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

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

Q&A

解決済

1回答

4553閲覧

"docker-compose build"実行時のエラー "Service 'web' failed to build: The command '/bin/sh -c bundle instal"

aki2626

総合スコア1

docker-compose

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Ruby on Rails

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

Docker

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

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

0グッド

0クリップ

投稿2020/07/09 05:37

前提・実現したいこと

HerokuにDockerを利用したRailsアプリをデプロイしようとしています。
現在コンテナイメージを作成しようとしています。
そこで発生した

ERROR: Service 'web' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code:

のエラーを解決したい。

発生している問題・エラーメッセージ

コンテナイメージを作成するために

$ docker-compose build

を実行したところ

Step 7/18 : ADD Gemfile Gemfile ---> 526bd50449c9 Step 8/18 : ADD Gemfile.lock Gemfile.lock ---> 3b1cf9727edc Step 9/18 : RUN bundle install ---> Running in ef47b06cd714 /bin/sh: 1: bundle: not found ERROR: Service 'web' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 127

と表示されました。

該当のソースコード

Dockerfile

1FROM ruby:2.5.1 2FROM jrottenberg/ffmpeg 3ENV LANG C.UTF-8 4RUN apt-get update -qq && apt-get install -y nodejs postgresql-client 5RUN mkdir /nagai_video 6WORKDIR /tmp 7ADD Gemfile Gemfile 8ADD Gemfile.lock Gemfile.lock 9RUN bundle install 10ENV APP_HOME /nagai_video 11RUN mkdir -p $APP_HOME 12WORKDIR $APP_HOME 13ADD . $APP_HOME 14 15# Add a script to be executed every time the container starts. 16COPY entrypoint.sh /usr/bin/ 17RUN chmod +x /usr/bin/entrypoint.sh 18ENTRYPOINT ["entrypoint.sh"] 19EXPOSE 3000 20 21# Start the main process. 22CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

version: '3' services: db: image: mysql:5.6.47 ports: - "4406:3306" restart: always environment: - MYSQL_DATABASE=nagai_video_db - MYSQL_ROOT_PASSWORD=password volumes: - ./data:/var/lib/mysql:rw command: --innodb_use_native_aio=0 web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/nagai_video ports: - "3002:3000" depends_on: - db environment: DB_HOST: db

database.yml(本番環境部分のみ)

production: <<: *default adapter: postgresql encoding: unicode pool: 5

試したこと

調べてみるとローカルとアプリでのbundlerのバージョンが違うことが原因の一つのようでした。
https://teratail.com/questions/253397
を参考にbundlerのバージョンを最新にし、gemfile.lockを削除してから再度bundle installしてdocker-compose buildを実行したがエラー内容は変わりませんでした。
実行結果は以下の通りです。

$ bundler version Bundler version 2.1.4 (2020-01-05 commit 32a4159325)

gemfile.lock

RUBY VERSION ruby 2.5.1p57 BUNDLED WITH 2.1.4

補足情報

ruby 2.5.1p57

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

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

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

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

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

guest

回答1

0

ベストアンサー

ビルド中のコンテナに bundlerruby もインストールされていないことが原因です:

console

1/bin/sh: 1: bundle: not found

原因の詳細

Dockerfile の命令は最後の FROM 命令のイメージに対する構築処理となります

お使いの Dockerfile では
最後の FROM 命令で指定されているイメージは jrottenberg/ffmpeg となっており、
こちらに bundlerruby もインストールされていません:

dockerfile

1FROM ruby:2.5.1 2FROM jrottenberg/ffmpeg

Dockerfile に FROM 命令を 2 つ以上定義した場合の動作

DockerfileFROM 命令を 2 つ以上定義することはできますが、
これはイメージが合成されるわけではありません

詳しい解説や利用例は次の記事を参照してください:

Docker multi stage buildで変わるDockerfileの常識 - Qiita
Use multi-stage builds | Docker Documentation

サービス提供に複数のプロダクトが必要な場合

コードから、Rails と ffmpeg が両方必要であるように読み取れます

サービス提供に複数のプロダクトが必要な場合は、
主に次のいずれかの方法で実装を行います:

  • どちらかのベースイメージに対して、もう一方のプロダクトをインストール
  • Docker Compose で別々のコンテナを起動し、
    コンテナ間通信や volume の共有を使って複数コンテナを連携させサービスを提供

投稿2020/07/09 09:14

編集2020/07/09 09:21
y_shinoda

総合スコア3272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問