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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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ライブラリです。

Q&A

解決済

1回答

4691閲覧

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

hajsu00

総合スコア151

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ライブラリです。

0グッド

0クリップ

投稿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からやり直したりなど簡単なことは試しましたが、同じような現象の記事が少なく未だ解決には至っておりません。

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

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

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

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

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

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

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のみにしてください おそらくそれで解決するかと
hajsu00

2022/03/13 14:58

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

2022/03/13 15:07

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

回答1

0

ベストアンサー

さらっと流し見ただけですが、pidを削除する際のPath間違ってませんか?
docker compose logs内のエラー文は以下
A server is already running. Check /hanger_talk/tmp/pids/server.pid.
ですが、docker-compise.ymlのコマンドは
rm -f /hanger_talk/api/tmp/pids/server.pid
です。
/api/のパスが余分な気がします。

あとReact(front)をどのような考えで使用しているかは分かりませんが、本番環境であればコンテナの中に(react-create-appだと)yarn build(だったはず)してビルドしたファイルを配置すればよいと思います。
(frontコンテナの中身が分かりませんが、一般的にはapache httpdやnginxだと想定します)
これもしかして、frontコンテナではyarn startを使用して開発用のサーバーを立ち上げてる感じですかね?

そうではなくて、開発環境としてコンテナを使うのであれば、コンテナ立てなくてもローカルで開発して、開発し終わったもの(front: build済みのhtml, jsファイル、api: railsディレクトリ)をコンテナに入れるだけの方が良い気がします。

投稿2022/03/14 06:25

YuuT

総合スコア673

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

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

hajsu00

2022/03/15 13:56

ご回答ありがとうございます。 ローカルのパスとコンテナ上のパスを混同していました。ご指摘の通りに修正したところ、pidファイルの件は正常に動作しました。 >これもしかして、frontコンテナではyarn startを使用して開発用のサーバーを立ち上げてる感じですかね? 開発はローカルで行い、キリがいいところでに入れて動作を確認する、というやり方を考えていました。これが、開発し終わったものをコンテナに入れる、ということでしょうか。 修正後はうまい具合にコンテナ上でアプリの動作を確認できています。 frontもapiも、どちらもパスの指定が間違っていたようです。 ありがとうございます。
YuuT

2022/03/16 01:23

> 開発はローカルで行い、キリがいいところでに入れて動作を確認する、というやり方を考えていました。これが、開発し終わったものをコンテナに入れる、ということでしょうか。 > 修正後はうまい具合にコンテナ上でアプリの動作を確認できています。 多分だいたい同じ認識だと思います。 ただ、一部認識違いがあるような気がします。 あくまで私個人の開発スタイルですが、開発はホストOS(Win, Macなど)で行い、完成したものをDockerImage化してコンテナサービスなりにデプロイするほうが開発しやすいと思っています。(この認識は一致していると思います。) frontをローカルで開発する場合、動作確認のため多くが簡易サーバーを立てると思います。 ポートが3000や8080になるものが多いです。 create-react-appだとyarn startで開発用のサーバーを立てたり、webpackを使用していればwebpack-dev-serverを使用したり(create-react-appも内部で使ってるかも)、VScodeであればLive Serverなどを使用したり... その後、動作が確認出来たら、yarn build等のコマンドでビルドを行って、ビルド後のファイル群をApache httpdなどのWebサーバー、今回だとWebサーバーのコンテナに配置します。 方法はDockerfileのCPコマンドでプロジェクトをコンテナ内の(/var/www/html/)に入れたり、場合によってはvolumeコマンドを使ってコンテナ起動後にマウントするかもしれません。 しかし、docker-compose.ymlを見ると、frontのコンテナでyarn startをしており、これはあくまでreact開発用に用意された簡易サーバーです。 実際にインターネット上に公開するのであれば、apache httpdやnginxを使用する方がパフォーマンス的には適していると思います。 ポートフォリオが一時的なもので、必要になったらローカルに立ち上げて人に見せる程度のものであれば、良いですが、就職や転職の面接などに使用する場合は、なぜ開発用のサーバーを使用しているのかを問われると思います。(なぜ3000番ポートでアクセスする仕様にしたのかなど) 少し私が考えすぎかもしれませんが、(次のステップで実現するのかもしれませんが)この状態である程度知識のあるエンジニア(仕事として開発している人)に見せるとインフラ側の知識が足りないような印象を持たれると思います。(もう少しインフラの知識も知ってほしいと思われるかもしれません) (おせっかいかもしれませんが)せめてポートはdocker-compose.ymlで80:3000(80番で受け付け内部では3000番に通す)設定をしたほうが良いかと思います。 (長文ですみません)
hajsu00

2022/03/20 13:48

お返事遅くなり申し訳ありません。 >その後、動作が確認出来たら、yarn build等のコマンドでビルドを行って、ビルド後のファイル群をApache httpdなどのWebサーバー、今回だとWebサーバーのコンテナに配置します。 丁度本日、React学習の中でbuildについて触れさせていただきました。確かに公開用であれば、build後のファイルをDockerコンテナに入れなければいけないですが、その認識が抜けていました。これまでに作ったものは開発用という認識すべきだったのですね。 ご指摘ありがとうございます。 インフラについてはまだあまり理解しておらず、ご指摘の通り目的が曖昧になっておりました。現役エンジニアの方にどう思われるかというアドバイス、非常に勉強になります。 もう一度、Dockerを使用する目的とインフラ周りのつながりについて整理してみたいと思います。 ありがとうございます!
YuuT

2022/03/22 04:48

少しでも理解の助けになり良かったです。 インフラ側はアプリから入ると苦手意識が強いかもしれませんが、いつかどこかで関係する領域なので、ゆっくりでもよいので理解をしていくとよいと思います。 アプリ開発含め頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問