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

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

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

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

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Ruby on Rails 6

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

Docker

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

解決済

docker-compose.yml内のシェルコマンド「command: sh -c "..."」が実行されず、コンテナが停止してしまう

hajsu00
hajsu00

総合スコア118

docker-compose

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

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Ruby on Rails 6

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

Docker

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1回答

0評価

0クリップ

1125閲覧

投稿2022/03/13 13:59

解決したいこと

Dockerを使用し、rails API + MySQL + Reactによりポートフォリオを作成中です。

docker-compose upでrails API + MySQL + React用それぞれのコンテナを起動しようとしたところ、docker-compose.yml内のコマンドが実行できずにコンテナが停止してしまい、解決できずに困っています。

以下のエラー解決へのヒントをいただけると幸いです。

エラー内容

docker compose ps

~/Documents/project/hanger-talk % docker-compose ps NAME COMMAND SERVICE STATUS PORTS hanger-talk-api-1 "entrypoint.sh sh -c…" api exited (1) hanger-talk-db-1 "docker-entrypoint.s…" db running 0.0.0.0:3306->3306/tcp hanger-talk-front-1 "docker-entrypoint.s…" front exited (2)

docker compose logs

~/Documents/project/hanger-talk/front % docker-compose up [+] Running 3/3 ⠿ Container hanger-talk-db-1 Created 0.0s ⠿ Container hanger-talk-front-1 Recreated 0.2s ⠿ Container hanger-talk-api-1 Recreated 0.2s Attaching to hanger-talk-api-1, hanger-talk-db-1, hanger-talk-front-1 hanger-talk-front-1 | sh: 1: cd: can't cd to front hanger-talk-db-1 | 2022-03-13 21:41:27+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1debian10 started. hanger-talk-front-1 exited with code 2 hanger-talk-db-1 | 2022-03-13 21:41:27+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' hanger-talk-db-1 | 2022-03-13 21:41:27+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1debian10 started. hanger-talk-db-1 | 2022-03-13T12:41:27.611241Z 0 [Warning] [MY-010918] [Server] 'default_authentication_plugin' is deprecated and will be removed in a future release. Please use authentication_policy instead. hanger-talk-db-1 | 2022-03-13T12:41:27.611316Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.28) starting as process 1 hanger-talk-db-1 | 2022-03-13T12:41:27.621779Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. hanger-talk-db-1 | 2022-03-13T12:41:27.802598Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. hanger-talk-db-1 | 2022-03-13T12:41:28.067553Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. hanger-talk-db-1 | 2022-03-13T12:41:28.067668Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. hanger-talk-db-1 | 2022-03-13T12:41:28.071121Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. hanger-talk-db-1 | 2022-03-13T12:41:28.117369Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock hanger-talk-db-1 | 2022-03-13T12:41:28.117658Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.28' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL. hanger-talk-api-1 | => Booting Puma hanger-talk-api-1 | => Rails 6.1.5 application starting in development hanger-talk-api-1 | => Run `bin/rails server --help` for more startup options hanger-talk-api-1 | A server is already running. Check /hanger_talk/tmp/pids/server.pid. hanger-talk-api-1 | Exiting hanger-talk-api-1 exited with code 1

開発環境および前提事項

開発環境

・macOS Monterey v12.1
・ruby v3.0.3
・Rails v6.1.4.4
・mysql 8.0.28
・Docker 20.10.12
・Docker Compose v2.2.3

コードおよびディレクトリ構造

docker-compose.yml

version: '3' services: db: image: mysql:8.0.28 volumes: - ./etc/my.cnf:/etc/mysql/conf.d/my.cnf - hanger_talk_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: <%= ENV['MYSQL_ROOT_PASSWORD'] %> TZ: 'Asia/Tokyo' command: --default-authentication-plugin=mysql_native_password ports: - 3306:3306 env_file: - ./api/.env tty: true api: build: context: ./api/ dockerfile: Dockerfile command: sh -c "rm -f /hanger_talk/api/tmp/pids/server.pid && bundle exec rails s -p 3001 -b '0.0.0.0'" image: rails:dev volumes: - ./api:/hanger_talk - ./api/vendor/bundle:/hanger_talk/vendor/bundle environment: TZ: 'Asia/Tokyo' RAILS_ENV: development ports: - 3001:3001 depends_on: - db links: - db front: build: context: ./front/ dockerfile: Dockerfile volumes: - ./front:/usr/src/app command: sh -c "cd front && yarn start" ports: - "3000:3000" tty: true volumes: hanger_talk_data: external: true

イメージ説明

考えられる原因と確認したこと

上記のログから、React(front)とrails(=api)はそれぞれ、docker-compose.yml
command: sh -c "cd front && yarn start"

command: sh -c "rm -f /hanger_talk/api/tmp/pids/server.pid && bundle exec rails s -p 3001 -b '0.0.0.0'"
が動いていないとの結論にいたりました。

Reactはcdに失敗し、railsはコンテナ起動時にserver.pidの削除ができずに怒られています。

しかし、なぜコマンドが動かないのかがわからずに困っています。

# docker compose logs ... hanger-talk-front-1 | sh: 1: cd: can't cd to front ... hanger-talk-api-1 | => Booting Puma hanger-talk-api-1 | => Rails 6.1.5 application starting in development hanger-talk-api-1 | => Run `bin/rails server --help` for more startup options hanger-talk-api-1 | A server is already running. Check /hanger_talk/tmp/pids/server.pid. hanger-talk-api-1 | Exiting # docker-compose.yml**ボールドテキスト** version: '3' services: db: ... command: --default-authentication-plugin=mysql_native_password <=おそらくこれも動いていない ... api: ... command: sh -c "rm -f /hanger_talk/api/tmp/pids/server.pid && bundle exec rails s -p 3001 -b '0.0.0.0'" ... front: ... command: sh -c "cd front && yarn start" ...

イメージのbuildからやり直したりなど簡単なことは試しましたが、同じような現象の記事が少なく未だ解決には至っておりません。

お忙しいところ申し訳ありませんが、よろしくお願いいたします。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

sk-sora--ypi

2022/03/13 14:02

hanger-talk-front-1 | sh: 1: cd: can't cd to front コレがエラーの理由のようですが pwdやlsでfrontフォルダの存在は確認できていますか?
hajsu00

2022/03/13 14:07

はい、ルートディレクトリでlsをしたところ、frontの存在を確認できています。 また、VScodeの作業ツリー上でも表示されていて、アクセス可能です。
sk-sora--ypi

2022/03/13 14:16

マウント先は/usr/src/appになっているようですが、ルートディレクトリで確認されているのですか? Dockerファイルのworkdirはどこになっているんでしょう。。。 docker-compose run front sh -c “pwd; ls” の結果を頂いでいいですか?
hajsu00

2022/03/13 14:20

以下のようになりました。 % docker-compose run front sh -c “pwd; ls” sh: 1: “pwd: not found zsh: command not found: ls” workdirについても確認します。
hajsu00

2022/03/13 14:21

frontのDockerfileです。 ``` FROM node:16.14.0 WORKDIR /usr/src/app ```
sk-sora--ypi

2022/03/13 15:07 編集

何故コマンド結果がそうなるんだろう… とりあえず原因はディレクトリの配置ですね ボリュームが下記のように指定しているので app配下にはfront配下(srcやDockerfile)が直接入っています ./front:/usr/src/app なのでshのコマンド内のcd front &&を消して yarn installのみにしてください おそらくそれで解決するかと
sk-sora--ypi

2022/03/13 14:33

そもそもどうやって構築しているのかはわかりませんが 最初はcommandの指定をせずにtty:trueの状態で起動し、 docker-compose exec front shするとか docker-compose run front sh等でコンテナ内で確認しながら構築していく方がいいですよ 構築が上手くいったらそのままDockerfileのRUNに記述すればOKです わざわざcommandにshで実行させるのは効率悪いかと
hajsu00

2022/03/13 14:58

ご指摘の通り実行したところ、Reactについては正常に動作しました!ありがとうございます! コンテナ内のディレクトリ構造を正しく理解できていませんでした。 commandを記述しない、という方法にも気が回っていませんでした。段階を飛ばさずに、ご指摘の通り直接中に入って確かめてみたいと思います。 Railsの方もそちらで解決できると思います。 ありがとうございます!
sk-sora--ypi

2022/03/13 15:07

いえいえ、私も最初は進め方がわからずアワアワしていたので、 ご参考になれば幸いです。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

docker-compose

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

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Ruby on Rails 6

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

Docker

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。