既存の光沢のあるアプリを更新する


byPeter Solymos
無料でエンタープライズ機能を提供しながらShinyProxyコンテナコンテナアプリケーションを実行します.あなたのユーザーを混乱させることなくアプリを更新する方法を学んでください.
ShinyProxy is one of the best self-hosting options あなたのアプリケーションのための認証とアプリケーションレベルの認証のようなエンタープライズ機能が必要なときにそこに.このポストでは、既存のアプリケーションを管理する方法を説明します.すべてのあなたのShinyProxyサーバーを再起動せずにこのようにすべてのユーザーが接続を維持.Docker画像で作業するときに覚えておくべき重要な問題がいくつかあります.
このチュートリアルのコードはanalythium/shiny-correlation githubリポジトリ.

どのようなときに更新プログラムを検討する


Remember how the apps are listedapplication.yml ファイル名/etc/shinyproxy フォルダ
  - id: 02_hello
    display-name: Demo Shiny App
    description: App with sliders and file upload
    container-cmd: ["R", "-e", "shiny::runApp('/home/app')"]
    container-image: analythium/shinyproxy-demo:latest
    access-groups: [admins]
ShinyProxyのアプリケーションを更新する2つの方法があります.あなたは、唯一のDocker画像を更新することができます.これはcontainer-image config . YAMLファイルのタグと他のすべては同じままです.だってapplication.yml ファイルは同じままですが、サーバー上でShinyProxyサービスを再起動する必要はありません.
あなたが何かを変えるならばapplication.yml 設定ファイルは、これらの変更のためにShinyProxyサービスを再起動する必要があります.これはcontainer-image タグ、新しいアプリケーションを追加したり、一般的な設定のいずれかに触れる.

Deploying and managing ShinyProxy can get complex when many apps are used, especially when the configuration of ShinyProxy is often updated. When restarting a running ShinyProxy instance (in order to update its configuration), users will face a disconnect from their running applications. – ShinyProxy Docs


ShinyProxyを再起動することは、すべての現在のユーザが彼らの光沢のあるセッションを失い、ログインしているユーザがログアウトされることを意味します.これは、慎重にDocker画像を管理することによって避けることができる中断です.また、ユーザーがログインしていないときに、または中断が最小限で、事前にユーザーに広告が掲載されているときに更新をスケジュールすることができます.
最初のシナリオにフォーカスしましょう.ポストの残りの部分はあなたのユーザーに混乱を最小限に抑えるためにあなたのイメージタグを管理する方法を説明します.

にアプリケーションを追加


The analythium/shiny-correlation GitHubリポジトリは、単純な光沢のあるアプリが含まれます.このアプリは、ハローシャイニーヒストグラムの例の二変量バージョンです.我々は、ローカルアプリケーションを構築し、ShinyProxyサーバーに展開します.

ビルドのイメージ


タグなしでDockerイメージを構築しましょう-f 使用するdockfileを指定するフラグ
docker build -f Dockerfile-v1 -t analythium/correlation .
すべての依存関係をすでに含んだ親イメージを指定したので、ビルドプロセスはかなり速くなければなりません.ここではDockerfile-v1 :
FROM analythium/shinyproxy-demo:latest
RUN rm -rf /home/app/*
COPY ./app-v1.R ./app.R
あなたがDockerイメージをリストするならばdocker image ls , あなたは何か面白いものを見る.そのイメージにはタグが付いている:latest , 私たちは少しずつ戻ってきます.
REPOSITORY                   TAG                 IMAGE ID
analythium/correlation       latest              90732201668c
を実行して画像をテストすることができますdocker run -p 4000:3838 analythium/correlation コマンドと訪問http://localhost:4000 .
サンプルサイズと相関を変更し、どのように強度の2次元推定が変更されている見てください.
光沢のあるアプリ:2相関変数の散乱プロットと2 D密度

にアプリケーションを追加


フォローするShinyProxy setup instructions またはShinyProxy 1-click app from the Digitalocean Marketplace ShinyProxyサーバーを設定します.
画像をレジストリにプッシュするdocker push analythium/correlation:latest ), に加えるShinyProxy configuration , ホストマシン上のイメージをプルし、ShinyProxyサービスを再起動しますservice shinyproxy restart .

既存のアプリケーションを更新


Dockerイメージ自体が変わるとき、しかし、その名前(タグを含む)は同じままでいます、あなたはShinyProxyを再開する必要はありません.あなたがDocker画像の新しいバージョンをあなたのDocker Registryに押しつけるとき、これは起こりますanalythium/correlation イメージ.

Docker画像を更新する


光沢のあるアプリのバージョン2の更新は、配布を使用してrgl Rパッケージ.として、新しいイメージをタグ付けしたい:v2 両方のバージョンを維持したいので.使用するDockerfile-v2 :
FROM analythium/shinyproxy-demo:latest
USER root
RUN install2.r -r http://cran.rstudio.com/ rgl
RUN rm -rf /home/app/*
COPY ./app-v2.R ./app.R
USER app
このDockerFileは、光沢のあるアプリケーションのバージョン2をイメージにコピーし、RGLパッケージをインストールします.
新しいイメージを作りましょう
docker build -f Dockerfile-v2 -t analythium/correlation:v2 .
今すぐドッカー画像のリストをプリントアウトdocker image ls :
REPOSITORY                   TAG                 IMAGE ID
analythium/correlation       v2                  9d98df8ea853
analythium/correlation       latest              90732201668c
我々は、新しいイメージをタグ付けした:v2 でも前のイメージは:latest . これは直観的な振る舞いです:latest タグは、最後に構築されたイメージを指します.代わりにthe last build/tag that ran without a specific tag/version specified "

If you push a new image with a tag which is neither empty nor ‘latest’, :latest will not be affected or created. – Vladislav Supalov


イメージタグ付けとバージョン管理


イメージタグを省略するときには注意する必要があります.ここでは、画像にバージョンを行うことができますし、また:latest タグは、最新のイメージの直感的な概念と一致します.
以前に作成した(バージョン1 )イメージを:v1 使用 docker tag command :
docker tag analythium/correlation analythium/correlation:v1
リストと確認:latest:v1 イメージIDが一致するためです.
REPOSITORY                   TAG                 IMAGE ID
analythium/correlation       v2                  9d98df8ea853
analythium/correlation       latest              90732201668c
analythium/correlation       v1                  90732201668c
今すぐタグなしでイメージを再構築する(これはキャッシュのために迅速にする必要があります)、これは新しいイメージを作る:latest . 新しいバージョンとして最新のイメージをタグ付けします.
docker build -f Dockerfile-v2 -t analythium/correlation .
docker tag analythium/correlation analythium/correlation:v2
リストを再度確認します:latest イメージIDマッチ:v2 :
REPOSITORY                   TAG                 IMAGE ID
analythium/correlation       latest              9d98df8ea853
analythium/correlation       v2                  9d98df8ea853
analythium/correlation       v1                  90732201668c
新しいイメージをテストしますdocker run -p 4000:3838 analythium/correlation 訪問 http://localhost:4000/ 相関変数の3 Dレンダリングで再生するには、次の手順に従います.

これらのイメージをレジストリにプッシュします.
docker push analythium/correlation
docker push analythium/correlation:v1
docker push analythium/correlation:v2

アプリケーションを更新します


この小さなDocker迂回の後、我々は最新のタグがバージョン2を意味するので、我々はShinyProxyのアプリケーションを更新するために追跡しています:
  • ssh rootユーザとしてShinyProxyサーバに
  • 画像の新しいバージョンをプルdocker pull analythium/correlation:latest
  • あなたがイメージをアップデートするとき、あるno need to restart the Docker or ShinyProxy services . 次回ユーザーがShinyProxyインストールでアプリケーションを起動すると、新しいイメージがコンテナを起動するために使用されます.
    あなたのイメージをversioningすることは、良い実行と考えられます.何か予期しないことが起こるとき、あなたは変化をロールバックすることができるように、それは多くの感覚を作ります.
    あなたのイメージを慎重にタグ付けし、ローカルのアプリをテストする場合は、使用することができます:latest 多くのトラブルなしであなたのShinyProxy構成のイメージタグ.また、ロールバックすることができます:v1 予想外の何かが起こるならば、あなたは設定を変えなければならなくて、このケースでサービスを再開しなければなりません.

    更新複数の既存のアプリ


    複数のアプリケーションがある場合は、それぞれの最新バージョンをプルする必要があります.スクリプトを使用したり、次の1ライナーを使用して、ホスト上のすべてのDockerイメージを更新します.
    docker images |grep -v REPOSITORY|awk '{print $1":"$2}'|xargs -L1 docker pull
    
    時々、あなたはremove dangling images with docker image prune -f . ダングリングイメージは、タグ付けされていないものであり、最新の画像で使用されない可能性のある任意のコンテナ、つまり中間層などで参照されません.これらは時間をかけて蓄積し、スペースを取ることができます.

    cronジョブを追加


    定期的にサーバー上の画像を更新するcronジョブを設定することができます.ランcrontab -e root権限でcronユーティリティにアクセスできます.エディタを選択するnano ) そうしなければ、これらの行をファイルの一番下に追加して保存します.
    # Cleanup at 3:00am every Sunday
    0 3 * * 0 docker image prune -f
    
    # Update all images at 1:00am every day
    0 1 * * * docker images |grep -v REPOSITORY|awk '{print $1":"$2}'|xargs -L1 docker pull
    
    設定をチェックcrontab -l .
    cronジョブは更新のポーリングタイプを表します.これは定期的に更新をチェックしています.一方、画像への変更がまれであれば、一定のポーリングの必要はない.一方、cron間隔を大きく設定すると、重要な更新が失われる可能性があります.
    これを念頭に置いて更新の周波数を選択します.既存のアプリや画像のwebhooksはconsidered a better alternative to polling , webhooksは私がここでカバーしていない少し多くの仕事を必要とするが.

    結論


    あなたのShinyProxyサーバーの既存のアプリケーションを更新する簡単です.あなたは、一度にすべての既に展開されたアプリケーションを更新するだけで1つのコマンドです-あなたのユーザーに混乱はありません.アプリを開く次のユーザーが更新されたバージョンが表示されます.しかし、タグ付けや注意してくださいあなたのイメージを不要な驚きを避けるために.

    更なる読書

  • The misunderstood Docker tag: latest
  • Pruning unused Docker images
  • Cron guide