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

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

ただいまの
回答率

88.64%

Dockerでgulp-notifyを使いたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 776

ayako01

score 27

Docker + gulpで開発環境を構築しています。
gulp-notifyというプラグインを使っているのですが、Docker上で動いているだけでMacのデスクトップに通知がきません。
ホストPC側に通知させることはできないでしょうか?

 試したこと

Dockerfileに以下の1行を追加

RUN yum install -y libnotify

 試そうとしたけどできなかったこと

https://github.com/fgrehm/vagrant-notify
https://stepquick.net/use-gulp-notify-with-terminal-notifier
vagrant-notifyというのがDockerでも使えるようですが、Dockerの場合のインストール方法がわかりませんでした。

 コード

const notify = require('gulp-notify');

function notify() {
  return plumber({errorHandler: notify.onError("<%= error.message %>")});
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

残念ながら結論から言うと、
Dockerを使わないでローカルで行ってくださいと言わざるをえません。
(追記: Slackを使う代替手段を思いつきました、回答の最下部をどうぞ)

以下はその根拠になるように調査しました。


fgrehm / vagrant -notifyをざっくりと斜め読みしました。
ゲストマシン単体では解決できないので、
プラグインがホストマシンで通知だけする単機能のサーバを立ち上げて、ゲストマシンがそこに向かってアクセスするスクリプトを実行することで実現しているようですね。

vagrant-notifyというのがDockerでも使えるようですが

想定されているのはVagrantのプラグインにより通知専用サーバを起動させる。
Vagrantで作ったゲストマシン内でDockerをインストールして使い、
Vagrant外側の通知専用サーバへアクセスするという手法を想定しているようです。

もし利用しているのがDocker for Macなら完全に別の話なので忘れましょう。


なので利用しているのがDocker for Macの場合、完全に別のアプローチが必要になりそうです。

gulp-notifyのソースコードを読みながら、
Express等で自力で同じような通知専用のサーバを立ち上げて、
コンテナ内部からhost.docker.internalへ向けてアクセスすればMacOSに向かってリクエストが飛ばせるのでこれを行う必要があります。

参考サイト: Docker for Macでコンテナの中からホストに繋ぐたった一つの冴えたやり方

しかし、この手法はNode.jsで自分で通知専用のサーバを書いて動かせと言っています。
質問文の意図からするとNode.jsの環境をホストマシンを汚したくないから、
DockerでNode.jsのコンテナ作って動かしているわけですよね。
そのホストマシンでNode.jsのサーバを立ち上げると何をやってるかわからなくなってしまいますね……

ElectronかなんかでGUIの実行ファイルを無理やり作って配布すればローカルは汚れませんが、
それはそれで高度な事になるでしょうね…


実際にgulp-notifyが何やってるのか興味が出てきたので突き止めました。
gulp-notifyはnode-notifierというnpmパッケージを利用して通知機能を実現しています。
ここからはOSで分岐していますが、例えばMacの場合だと'vendor/terminal-notifier.app/Contents/MacOS/terminal-notifier'という実行ファイルを自力実装して呼び出しています。

node-notifier/notifiers/notificationcenter.js


別の回答者さんが紹介していた「gulp-docker-notify」も調査してみました。
codemonauts/gulp-docker-notify
こちらもやはり私が上記で上げた作戦を利用しているようです。

実行のコア部分はclient.send(message, 9090, 'docker.for.mac.localhost', fn)と書いてあり、
要するにUDP接続でMacOS本体の9090番ポートにアクセスして変わりに通知してくださいと言ってます。

おいおいDocker for Mac前提かよといった感じのツッコミどころはありますが、概ね私が解説した通りのやり方で実現しようとしているようです。
しかし、このローカルで動いている9090/UDPの通知専用サーバどこやねん。

製作者さんのリポジトリを漁っていたらそれらしきものを見つけました。
codemonauts/macos-gulp-notificationsです。
SwiftならばMacOSのAPI部分に簡単にアクセスできますので、コンパイルして動かせと言ってるわけですね。
いやぁ…Swiftのコンパイルとか完全に管轄外なので、ここから先は案内できませんが……

MacOSでSwiftのコードをドキュメントなしでコンパイルして動かせるほどの腕があるなら試してみてもいいかもしれません。


【おまけ】Slackを代替手段として利用する

環境が違うことで動かない人が出てきたというのがあり、Dockerの導入を決めました。

そうなんですねぇ…
あ、でしたら代替手段としてSlackというのはどうでしょう?

Slackは発言を感知するとChrome等のブラウザ越しに通知が行えます。
でも単なるチャットではなく、SlackにはAPIが備わっており、開発者機能からトークンを生成して特定のURLにPOST通信を飛ばせばSlackの画面以外からでも発言出来るんですよ。
これを利用して、自分用のチャットルームを作ってそこで発言すればgulp-notifiと似たような事が実現出来るはずです。

試しに調べてみると、やはりgulp-slackというパッケージが用意されていて使えるようです。
使ってはいませんが一度試して見てください。
しかし、実際にチームの開発環境構築ということで直接トークンIDを埋め込むのは怖いので一工夫しましょう。

Dockerはコンテナ起動時に環境変数として文字列を外側から注入出来ます。
gulpfile.jsにはprocess.env.SLACK_HOSTと環境変数を参照するようにしておき、
docker-compose.ymlファイルにSLACK_HOSTみたいな環境変数を注入する設定にして配布しましょう。

以下参考サイト

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/17 09:09

    もともとローカルでgulpを使っていたのですが、発端は
    ・人ごとに毎回開発環境を構築するのが面倒なので効率化したい
    ・少し古いバージョンからあげられないライブラリがある
    ・環境が違うことで動かない人が出てきた
    というのがあり、Dockerの導入を決めました。
    ローカルに依存してしまうと、また同じ問題になってしまいそうです。

    なので、通知はあきらめることにしました。
    できない、または難しいということがわかってよかったです!ご回答ありがとうございました!

    キャンセル

  • 2018/08/17 11:50

    事情を聞き、Slackなら割と現実的に実現できそうだったので追記しました。
    ご確認くださいね。

    キャンセル

  • 2018/08/17 12:04

    社内ではチャットワークを使っていて同じようなことはできそうですが、若干環境が難しくなるのと、初期工数もかかりそうなので、通知がないと困るという声が多いようだったら追加で検討してみようと思います。
    ありがとうございます!

    キャンセル

0

https://github.com/codemonauts/gulp-docker-notify
こちらのプラグインをご試用されてみてはいかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/16 09:01

    これも試しましたが状況は変わらず、エラーは出ないけど通知は表示されない状態です。

    キャンセル

  • 2018/08/16 12:55

    実際に読んで調査しましたが、
    これ完全に自分専用のもので他人が動かす想定のものではないですね…
    詳細は私の回答の方にぶら下げておきます。

    キャンセル

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

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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