2017-05-18 9 views
0

私は、nginxイメージに基づいて、Dockerコンテナで配布された小さなWebアプリケーションを開発します。それはフレームワークのないプレーンなhtmlとjsコードを含んでいます。JSコードの異なるバージョン(開発および制作)の作成方法は?

JSコードでは、WebSockets経由でリモートホストにアクセスできます。環境には違いがあります。ローカルホストでのテストでは、httpsを使用するプロダクションサーバー上でhttp経由で動作します。だから、のWebSocketに渡されるURLは、信頼性の高いソリューションは、私は、開発と生産の両方のための単一ドッカーイメージを維持したい考えると、コードでこれらのURLの2つのバージョンを維持する、とだけ使用することです何ws://またはwss://

のいずれかで開始します異なるDocker設定スクリプトを作成しますか?ここで

// This is for testing in localhost environment 
var url = "ws://" + window.location.host + window.location.pathname + "bridge/"; 
// This is for working in production environment 
var url = "wss://" + window.location.host + window.location.pathname + "bridge/"; 
BRIDGE.socket = new WebSocket(url); 
+1

使用しているjsまたはスクリプトのコードを入力してください –

+0

本当にDockerに関連しているとは思われません。 Dockerが関与していなくても同じ問題が起こるでしょうか? –

+0

@AndyShinn確かに、Dockerなしでは、問題は残っています。しかし、私はそれを解決したいので、Dockerの機能を使用して関連しています。私はすでに、プロジェクト内の他のイメージのために異なるCompose構成ファイルをオーバーライドしています。 – augur

答えて

1

はシンプルな「実行時にテンプレート置換」仕事ができるという考えです:

WebSocketを持つ仕事の例があります。

Docker Hubからの画像nginxは実際にenvsubstと呼ばれるgettextパッケージからのユーティリティを持っています。ファイル内の環境変数を置き換えることができます。実行時にこれを利用して、クイックシェルスクリプトをエントリポイントとして作って、私たちの代わりにすることができます。

まずは、entrypoint.shスクリプトを作成してみましょう:

#!/bin/sh 

if [ -n "$BASEURL" ]; then 
    envsubst '$BASEURL' </my.js.template> /my.js 
    exec nginx -g "daemon off;" 
else 
    echo "you must specify \$BASEURL as en environment variable" 
fi 

これは/my.js.templateでファイルを探します。私たちは、元nginxに基づいて新しいドッカーイメージでこれをラップする必要があります

var url = "$BASEURL" + window.location.pathname + "bridge/"; 

:私のサンプルファイルは次のようになります。それは、$BASEURLを置き換えます

docker run -d -e BASEURL=wss://myhost mynewnginximage 

:よう/my.jsあなたは環境ごとにURLを交換したいファイルだったと仮定して、あなたはこのイメージを起動することができ、

FROM nginx 
COPY entrypoint.sh /entrypoint.sh 
COPY my.js.template /my.js.template 
ENTRYPOINT ["/entrypoint.sh"] 

Dockerfileは次のようになりますintテンプレートを作成して/my.jsに書き出し、元のベースイメージと同じようにnginxをPID 1として実行します。

もちろん、実際のコードにシェルスクリプトのパスを適合させる必要があります。しかし理論的には、同じイメージを使用できるようになり、環境ごとに環境変数を変更するだけです。これは、ローカルのシェルに設定されているBASEURLを使用してコンテナにそれを通過するdocker-composeを指示します

environment: 
    BASEURL: 

:ドッカー作曲では、次のような空白の環境変数を指定することができます。何かが意味がないと私は明確にしようとすることができるなら、私に教えてください

export BASEURL=ws://myhostfordev 
docker-compose up 

:だから、あなたは次のようにdocker-compose upを行うwouldn。より多くのテンプレート作成のためのenvsubstの代わりに、より強力で、テンプレートの入力として環境変数を取ることができるhttps://github.com/kelseyhightower/confdのようなものがあります。

+0

私はあなたのソリューションが好きです! Entrypointのenvsubstは、適切な場所で適切なツールであるようです。実際、WebsocketのURLだけでなく、 'APP_ENV =" $ APP_ENV "'のようなJS幅の定数を定義し、コード内のswitch文で使っています。 – augur

+0

あなたが見るように、Dockerは間違いなく問題解決に関連していました;) – augur

関連する問題