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

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

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

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

シェルスクリプト

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

Ruby on Rails

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

Docker

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

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

Q&A

1回答

3905閲覧

CircleCIで実行したシェルスクリプトがdocker-compose runの部分で止まる

indyyy

総合スコア0

docker-compose

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

シェルスクリプト

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

Ruby on Rails

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

Docker

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

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

0グッド

0クリップ

投稿2021/08/23 05:10

編集2021/08/23 05:13

前提・実現したいこと

Railsでアプリを制作しており、今はCircle CIで自動デプロイに挑戦しております。
github上でmainにマージしたタイミングでCircle CIを動作させ、githubからpull、Railsにdb:migrate:reset、db:seedさせたいと考えております。
デプロイ動作を記述したシェルスクリプトをサーバ上にあらかじめ作成しておき、それをCircle CIに実行させたところ、途中で止まってしまいました。エラー文はToo long with no output (exceeded 10m0s): context deadline exceededです。

シェルスクリプトは、手動でEC2にsshログインし実行させれば問題なく動作することが確認済みです。
シェルスクリプトで止まってしまう箇所は、下に詳しく書きますが、docker-compose run ~をする部分です。
このためCircle CIの仕様、または設定に原因があるのではないかと考えていますが、初めて触るため何をどう対処して良いか分からず質問させていただきました。

自動デプロイはhttps://qiita.com/ashketcham/items/0518322e5eca2896c0f0を参考にしました。

Railsアプリの構成

EC2上にdocker-composeをインストールし、docker-composeでRailsアプリを稼働させております。

  • EC2 Linux/UNIX
  • docker-compose version 1.29.2
  • ruby 2.5.9
  • Rails 5.2.6
  • nginx 1.15.8 (webサーバ)
  • unicorn 6.0.0 (アプリケーションサーバ)
  • RDS MySQL8.0.23 (データベース)
  • S3 (画像サーバ)

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

Circle CI上で、ジョブの詳細画面でみることができるターミナル画面?です。

#!/bin/bash -eo pipefail ssh -p $SSH_PORT $SSH_USER@$SSH_HOST "/PhotoContestApp/deploy-me.sh" Warning: Permanently added '**********' (ECDSA) to the list of known hosts. Stopping photocontestapp_web_1 ... Stopping photocontestapp_app_1 ... Stopping photocontestapp_web_1 ... done Stopping photocontestapp_app_1 ... done Removing photocontestapp_web_1 ... Removing photocontestapp_app_1 ... Removing photocontestapp_app_1 ... done Removing photocontestapp_web_1 ... done Network app-network is external, skipping <===ここまでdocker-compose down Already up to date. <===git pull Creating photocontestapp_app_run ... <===docker-compose run 開始 Creating photocontestapp_app_run ... done <===ここで止まってしまう                         Too long with no output (exceeded 10m0s): context deadline exceeded

該当のソースコード

EC2上にあらかじめ作成しておいたシェルスクリプト

shellscript

1#!/bin/bash 2 3cd /PhotoContestApp/ 4docker-compose -f docker-compose.production.yml down 5sudo git pull 6docker-compose -f docker-compose.production.yml run --rm app rails db:migrate:reset db:seed DISABLE_DATABASE_ENVIRONMENT_CHECK=1 7docker-compose -f docker-compose.production.yml up -d

Railsアプリの中に作成した.circleci/config.yml

version: 2.1 orbs: ruby: circleci/ruby@0.1.2 jobs: deploy: machine: enabled: true steps: - add_ssh_keys: fingerprints: - xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx - run: ssh -p $SSH_PORT $SSH_USER@$SSH_HOST "/PhotoContestApp/deploy-me.sh" workflows: version: 2 deploy: jobs: - deploy: filters: branches: only: main

試したこと

docker-compose -f docker-compose.production.yml run --rm app rails db:migrate:reset db:seed DISABLE_DATABASE_ENVIRONMENT_CHECK=1

でなく

docker-compose -f docker-compose.production.yml run --rm app rails db:migrate

docker-compose -f docker-compose.production.yml run --rm app ls -la /

としてもやはり止まってしまいます。このことからdocker-compose runでコンテナが起動した後の動作が影響しているのではないかと考えます。いずれも手動での動作は確認済みです。

補足情報

docker-compose.production.yml

version: '3' services: app: build: context: . command: bundle exec unicorn -c /app/config/unicorn.rb -E production -p 3000 ports: - '3000:3000' volumes: - .:/app - public-data:/app/public - tmp-data:/app/tmp - log-data:/app/log networks: - app-network stdin_open: true tty: true environment: RAILS_ENV: production web: build: context: ./nginx_docker_production volumes: - public-data:/app/public - tmp-data:/app/tmp ports: - 80:80 depends_on: - app networks: - app-network volumes: public-data: tmp-data: log-data: db-data: networks: app-network: external: true

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

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

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

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

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

guest

回答1

0

こんばんは。
メッセージだけ見てのコメントになります。(中身はあまりちゃんと確認できていなくて申し訳ありません)

Too long with no output (exceeded 10m0s): context deadline exceeded のメッセージは、CircleCIから、「このビルドに時間がかかりすぎてるよ」というメッセージで、確か10分程度ビルドが続くと中断(失敗)してしまうかと思います。

参考リンク:

また、.circleci/config.yml の設定を拝見すると、CIの中で ssh でEC2 インスタンスにログインして、 deploy-me.sh を実行しているようですね。

この処理は、docker-compose up -d .... でアプリケーションを動かす内容になっていますが、これだと、docker-compose up -d の処理は中断されない限りずっと続くので、ssh のセッションもそのまま続くことになります。

(10分以内だったら、おそらくご想定のアプリケーションにアクセスできるのではないでしょうか?)

ssh のセッションを呼び出しているのが、CircleCI なので、10分以上経ったら結果的にssh の処理を中断するといった状況になっているかと思います。

シェルスクリプトは、手動でEC2にsshログインし実行させれば問題なく動作することが確認済みです。

とのことですが、シェルスクリプトを実行後、ssh ログアウトしたらどうなりますでしょうか?
おそらくアプリケーションも終わってしまうので、CircleCI もそれと同じ状況かと思います。

投稿2021/09/10 13:48

suama

総合スコア1997

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

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

indyyy

2021/09/10 15:37

回答ありがとうございます。 おっしゃる通りCircleCIでEC2にsshログイン、git pull、dockerコンテナ再構築、起動を行っております。 理解できていないだけでしたら申し訳ありませんが、CircleCIの処理が止まるのはdocker-compose 「run」の部分で、docker-compose 「up」の部分ではありません。 また、doccker-compose -dはコンテナをバックグラウンドで動作させるコマンドなので、セッションは正常に終了するものと認識しております。 現在、サーバへのデプロイには手動でシェルスクリプトを実行させる方法をとっておりますが、シェルスクリプトは正常に終了し、sshログアウトしてからもアプリケーションは起動したままです。
suama

2021/09/11 09:52

こんにちは。 どちらにしても、docker-compose run で時間がかかっていて、CircleCIが停止してしまっている状況かな、と思います。 git pull やdocker-compose run の処理がとても長くかかっているのでは?
indyyy

2021/09/13 11:36

git pullの処理は問題ないと考えています。根拠は2つです。 1.手動で行えば10秒もかからず終わる処理であること。 2.今回のエラーメッセージではgit pullの処理は正常に終了していること。 また、docker-compose runに関してですが、質問文にもあるように以下の処理を行った場合においても同じエラーメッセージが出力されます。 docker-compose -f docker-compose.production.yml run --rm app ls -la / lsコマンドに時間がかかっていることは考えにくいと思いますし、実際に手動では10秒かからず終わる処理です。 上記の理由により、エラーメッセージ通り、単純に処理に時間がかかりすぎているだけとは考えにくいと思います。
suama

2021/09/13 22:09

コメントありがとうございます! 実際には、CircleCI で失敗のメッセージが出るまでに10分以上かかっていますか? あとは、それ以上の中身が分からないのでなんともいえないのですが、ssh でCircleCIに入ってデバッグするといいかなと思います。 https://circleci.com/docs/ja/2.0/ssh-access-jobs/ わたしからはここまでで申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問