カテゴリー : 2017年 4月

[Docker] Error response from daemon: Container xxx is restarting, wait until the container is running の解決方法

Docker で Error response from daemon: Container xxx is restarting, wait until the container is running というエラーが発生したときの解決方法をご紹介します。

Docker

前提

Mastodon を Linode VPS で稼働させていたら物理ハードウェア障害に遭遇して、トラブル解消後にアプリケーションが乗ってる docker コンテナがエラー出しまくって起動しなくなったとういうお話です。

Docker エラーの状況調査

$ sudo docker exec -it mastodon_web_1 /bin/sh
Error response from daemon: Container e398061d59d6cb20f3cdbbf4013e9e6e8080b8c1afc59d7b06b7d8c3f0dd1d47 is restarting, wait until the container is running

まず mastodon_web_1 の shell に入れるか試しましたが無理でした。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS                              NAMES
45ebb1c8ef61        gargron/mastodon    "npm run start"          2 days ago          Up 4 minutes                    3000/tcp, 0.0.0.0:4000->4000/tcp   mastodon_streaming_1
9d8bd45c983c        gargron/mastodon    "bundle exec sidek..."   2 days ago          Up 4 minutes                    3000/tcp, 4000/tcp                 mastodon_sidekiq_1
e398061d59d6        gargron/mastodon    "bundle exec rails..."   2 days ago          Restarting (1) 18 seconds ago                                      mastodon_web_1
53e10f7f14d4        postgres:alpine     "docker-entrypoint..."   3 days ago          Up 4 minutes                    5432/tcp                           mastodon_db_1
04f51c868073        redis:alpine        "docker-entrypoint..."   3 days ago          Up 4 minutes                    6379/tcp                           mastodon_redis_1

docker ps でコンテナの状況を確認したところ Restarting (1) ステータスのまま起動しないようでした。

$ docker logs e398061d59d6
 
A server is already running. Check /mastodon/tmp/pids/server.pid.
=> Booting Puma
=> Rails 5.0.2 application starting in production on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
Exiting

docker logs コマンドでログを確認してみると puma サーバーのプロセス起動で失敗していることがわかりました。

対応した手順

$ docker rm mastodon_web_1
mastodon_web_1

mastodon_web_1 はアプリケーションのコンテナなので docker rm コマンドで mastodon_web_1 を削除してしまいます。これがもし、データベースのコンテナだった場合 docker rm で削除できないので、他のアプローチを考えないといけません。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
45ebb1c8ef61        gargron/mastodon    "npm run start"          2 days ago          Up 19 minutes       3000/tcp, 0.0.0.0:4000->4000/tcp   mastodon_streaming_1
9d8bd45c983c        gargron/mastodon    "bundle exec sidek..."   2 days ago          Up 19 minutes       3000/tcp, 4000/tcp                 mastodon_sidekiq_1
53e10f7f14d4        postgres:alpine     "docker-entrypoint..."   3 days ago          Up 19 minutes       5432/tcp                           mastodon_db_1
04f51c868073        redis:alpine        "docker-entrypoint..."   3 days ago          Up 19 minutes       6379/tcp                           mastodon_redis_1

docker ps で mastodon_web_1 が無いことを確認します。

$ sudo docker-compose stop
Stopping mastodon_streaming_1 ... done
Stopping mastodon_sidekiq_1 ... done
Stopping mastodon_db_1 ... done
Stopping mastodon_redis_1 ... done

docker-compose stop で全てのコンテナを停止して、

$ sudo docker-compose up -d
Starting mastodon_redis_1
Starting mastodon_db_1
Starting mastodon_streaming_1
Starting mastodon_sidekiq_1
Creating mastodon_web_1

docker-compose up -d でコンテナを起動させます。

このとき mastodon_web_1 は無いので、新しくコンテナが作成されます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
20ce27549e01        gargron/mastodon    "bundle exec rails..."   5 minutes ago       Up 5 minutes        0.0.0.0:3000->3000/tcp, 4000/tcp   mastodon_web_1
45ebb1c8ef61        gargron/mastodon    "npm run start"          2 days ago          Up 5 minutes        3000/tcp, 0.0.0.0:4000->4000/tcp   mastodon_streaming_1
9d8bd45c983c        gargron/mastodon    "bundle exec sidek..."   2 days ago          Up 5 minutes        3000/tcp, 4000/tcp                 mastodon_sidekiq_1
53e10f7f14d4        postgres:alpine     "docker-entrypoint..."   3 days ago          Up 5 minutes        5432/tcp                           mastodon_db_1
04f51c868073        redis:alpine        "docker-entrypoint..."   3 days ago          Up 5 minutes        6379/tcp                           mastodon_redis_1

docker ps で無事に mastodon_web_1 が起動していることも確認できました。

まとめ

Mastodon で初めて Docker を使うことになった方も

参考情報

Mastodon のメール送信設定 – Gmail 編

Mastodon で送るメールを Gmail を利用してメール送信する設定をご紹介します。

Mastodon マストドン

.env.production のメール配信設定

メール配信の設定項目は .env.production というファイルの SMTP_* という部分です。

SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_LOGIN=my.gmail.account@gmail.com
SMTP_PASSWORD=mypassword
SMTP_FROM_ADDRESS=my.gmail.account@gmail.com
SMTP_DOMAIN=gmail.com
SMTP_OPENSSL_VERIFY_MODE=none

メール配信サービスを利用せず、無料でメールを送信したい方には Gmail を利用できるのはありがたいですね。

参考情報

[Linode] Coupon Code と Referral Code を調べる方法

Linode (ライノード) に登録する Coupon Code と Referral Code を探す方法をご紹介します。

Linode ライノード

Linode の Coupon Code

まず Coupon Code は RetailMeNot というサイトに常時 $10 ~ $20 OFF のクーポンコードが掲載されているので、こちらをチェックしましょう。

Linode の Referral Code

次に Referral Code は、

edd6f2793f5820f9c6d12dd386459c52b1e667ec

が使えます。

以下の URL 経由で Sign up しても Referral Code が適用された状態で Linode に新規会員登録できます。

https://www.linode.com/?r=edd6f2793f5820f9c6d12dd386459c52b1e667ec

よき Linode ライフを!

Mastodon マストドンの使い方、サーバー構築、便利ツールまとめ

Mastodon マストドンの使い方、サーバー構築、便利ツールなどが紹介されている良い記事だけをまとめたのでご紹介します。

Mastodon マストドン

Mastodon マストドンの使い方

概念や思想的な話、つまりポエム

Mastodon サーバー構築

さくらのクラウドで Mastodon のサーバーをサクッと起動できる仕組みが公開されました。

さくらの VPS で Mastodon を動かすやつ。

AWS で Mastodon を動かすやつ。

Mastodon サーバー構築していて困ったら Qiita の記事を探すといいんじゃないでしょうか。

実際に使えるサーバーやツールなど

coron.tech というサイトで Mastodon のサーバ一覧がよくまとめられているので、このサイトから自分の趣向にあったインスタンスを立てるといいんじゃないでしょうか。

Mastodon 情報まとめ

色んなメディアや開発者が情報を発信しているようなので、この記事も随時更新していきます。

Google Apps Script でスクレイピング 〜 ページ内に特定の文字列が含まれているか判定する

Google Apps Script ページ内に特定の文字列が含まれているかを判定するスクレイピングみたいなコードを書いたのでご紹介します。

Google Apps Script

コードの処理の流れ

  1. UrlFetchApp.fetch でレスポンスを取得する
  2. response.getContentText で HTTP response のコンテンツをエンコード済みの文字列で取得する
  3. String.prototype.indexOf() で文字列に ‘Example’ を含んでいるか判定する

Google Apps Script のサンプルコード

以下、

function myFunction() {
  var contentText = fetchContentText("http://example.com");
 
  if (contentText.indexOf('Example') !== -1) {
    Logger.log('◯');
  } else {
    Logger.log('☓');
  }
}
 
function fetchContentText(url){
  var opt = {"contentType":"text/html","method":"get"};
 
  var response = UrlFetchApp.fetch(url, opt);
  var contentText = response.getContentText();
  return contentText;
}

基本的なスクレイピングは少しのコードで実現できました。

このコードを元に、次は判定結果を Google スプレッドシートに追記していくコードを書けば利用の幅が広がる気がしています。

参考情報