社内プロキシ(認証有)な環境でdockerのイメージをビルドしたい

行いたい事

  • docker-composeを用いて、dockerfileのビルドをWindows10のPCで行いたい
  • WIndows10のDocker Desktop for Windowsでコンテナを起動させたい
  • 社内プロキシ(認証有)な環境で行いたい

事前設定・嵌った時の振り返りポイント

  • Docker Desktop for Windowsのプロキシ設定を確認しておく

 多分ビルドの時は直接アクセスするパターンが主ではあるが、コンテナ起動後の問題になるので

 http_proxyなど定義されているかどうか、それが想定通りなのかどうか

  • Windows10のプロキシ設定

WinHTTPプロキシの設定方法 - maruko2 Note.
・docker-composeを実行する環境のプロキシ設定
 上記を全て確認したのに、実行するコンソールの時だけ想定と狂っている事ないか

対応方法

ゲストOS, ゲストOS内pip用

docker-composeを実行する際に引数としてプロキシ情報を渡してあげる
大文字と小文字両方定義しておく方が無難

set USER=hoge
set PASS=hogehoge
set PROXY=http://%USER%:%PASS%@proxy.example.com:8888
docekr-compose build --build-arg HTTP_PROXY=%PROXY% --build-arg HTTPS_PROXY=%PROXY% --build-arg http_proxy=%PROXY% --build-arg https_proxy=%PROXY%
ゲストOS内npm用

dockerfileにプロキシを参照する記述を行う
docker-composeで渡された環境変数を利用できるので、それで設定する
registryのデフォルトがhttps~なので、http~にしないと動かない場合がある(串次第?)

RUN npm config set proxy $http_proxy
RUN npm config set https-proxy $https_proxy
RUN npm config set registry http://registry.npmjs.org/

その他

利用したいnpmパッケージによっては、上記を設定しても動かない場合があるかも

私の場合は、JupyterLabでJavaScriptを利用するためのijavascriptが導入できなかった。

Step 15/21 : RUN npm install -g ijavascript
 ---> Running in f3dd86b4f755
npm ERR! code 1
npm ERR! path /usr/lib/node_modules/ijavascript/node_modules/zeromq
npm ERR! command failed
npm ERR! command sh -c node scripts/prebuild-install.js || (node scripts/preinstall.js && node-gyp rebuild)
npm ERR!
npm ERR! Error: connect ECONNREFUSED 52.192.72.89:443
npm ERR!     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:16) {
npm ERR!   errno: -111,
npm ERR!   code:

それ以外は無事導入できている事や、
他のパッケージで上記エラーをパッケージ側で直している事から多分自力では無理かも。
github.com
ただ自分のせいで無い事が証明できないのでissue登録できない…

ホスト名が解決できない場合は、docker-composeに定義すれば解決できる

qiita.com

ダブルクオーテーションなどの方言

プロキシの認証ユーザー名やパスワードのところにダブルクオーテーションが無いからエラーとか見かけた。
それを付ければ動くんだという回答と、それで動いた!ありがとう!というやりとりを見かけた。
よって、利用している社内プロキシによってはあり得るのかもしれない。
但し、私の環境では特にそんなことしなくても無事動いた。

Jupyter LabでPlotly Expressの図が表示されない

事象

Pandasのplotメソッドで表示した図は表示されるのに、Plotly Expressで表示した図が表示されない。

Plotly Expressのplotメソッド部分が何も表示されていない

原因

Jupyter Labにplotly-extensionを追加できていないため

対応方法

以下のサイトに従い、plotly-extensionを追加する
jupyterlab-plotly - npm

jupyter labextension install jupyterlab-plotly
無事表示された

補記事項

  • jupyter serverextension enable --py jupyterlab-plotlyと書くとエラーが発生する。

 なお、jupyter serverextension enable --py jupyterlabさえすれば活性化される。

  • jupyter labextension install @jupyterlab/plotly-extensionはdeprecatedなので、使わない。
  • Jupyter Labは一度再起動した方が良い

Jupyter LabのLauncherにJavaScriptを追加したい

【前提】
node.jsがインストールされている

【対応方法】

npm install -g ijavascript
ijsinstall

改訂版 Pythonユーザのための Jupyter[実践]入門

改訂版 Pythonユーザのための Jupyter[実践]入門

Node.js超入門[第3版]

Node.js超入門[第3版]

Jupyter LabにExtentionを導入しようとしたらNode.jsとnpmが無いと怒られる

事象

Jupyter LabにExtensionを導入しようとしたら以下の様なエラーが発生した。

root@096e8b5bcfb1:/usr/src/app# jupyter labextension install jupyterlab_vim
An error occured.
ValueError: Please install Node.js and npm before continuing installation. You may be able to install Node.js from your package manager, from conda, or directly from the Node.js website (https://nodejs.org).
See the log file for details:  /tmp/jupyterlab-debug-lniy1xvy.log

対応方法

記載の通り、Node.jsとnpmをインストールする

# dockerfileに書き足した内容
RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
RUN apt-get install -y nodejs
RUN npm install npm@latest -g

間違えた内容

・pipでnode.jsとnpmをインストールしていた
 →利用したいのは、あくまでもOS側

・普通にapt-getなどでnode.jsをインストールする
 古いNode.js(v10系)がダウンロードされる。
 Jupyter Extentionは最低v12系が必要との事で動かなかった。

その他

利用したかったExtensionが現時点では利用できそうになかった。。
(別途開発版とかでごにょごにょすればいけるかもか)

# jupyter labextension install jupyterlab_vim
An error occured.
ValueError: The extension "jupyterlab_vim" does not yet support the current version of JupyterLab.

docker-composeで共有ディスクの指定をして起動しようとするとエラー

事象

以下の記事を参考にdocker-composeでJupyter Labを起動させたい。
qiita.com

しかしながら、以下の様なエラーが発生してしまい、起動しない。
(一部ディレクトリ変更はしているが、その部分のエラーではない)

C:\dockerfile\JupyterLab>docker-compose up
Creating network "jupyterlab_default" with the default driver
Creating jupyterlab_jupyterlab_1 ... error

ERROR: for jupyterlab_jupyterlab_1  Cannot start service jupyterlab: error while mounting volume '/var/lib/docker/volumes/jupyterlab_jupyterlab-dir/_data': 
failed to mount local volume: mount C:\c\jupyterlab:/var/lib/docker/volumes/jupyterlab_jupyterlab-dir/_data, flags: 0x1000: no such file or directory

ERROR: for jupyterlab  Cannot start service jupyterlab: error while mounting volume '/var/lib/docker/volumes/jupyterlab_jupyterlab-dir/_data': 
failed to mount local volume: mount C:\c\jupyterlab:/var/lib/docker/volumes/jupyterlab_jupyterlab-dir/_data, flags: 0x1000: no such file or directory
ERROR: Encountered errors while bringing up the project.

発生している環境

  • Windows10 pro
  • WSL2
  • Docker Desktop for Windows

原因

不明(調べきれなかった)

対応方法

パスを直接指定する事にした

[docker-compose.yml]

version: '3'
services:
  jupyterlab:
(中略)
    volumes:
#      - jupyterlab-dir:/home/JupyterLab/codes
       - c:\jupyterlab:/home/JupyterLab/codes
(以下略)
共有ディスクとして設定した内容確認方法
ボリューム一覧
docker volume ls
ボリューム詳細
docker volume inspect ボリューム名
ボリューム削除
docker volume rm ボリューム名

上記の例であれば、jupyterlab-dirというボリューム名が作成されているので、削除する。
なお、設定したボリュームの中身更新したい場合は、一度削除した方が良さげ。

分からなかった事

volumesで動くマシンと動かないマシンの違い

実は直接パスを指定しなくても動く端末もあった。
しかし、別の端末では同じエラーが発生し続けた。
dockerのバージョンから始まり、色々見比べたが差異が見つけれなかった。。
オプション指定とか今はしたい訳でもないので、一旦忘れる。

C:\c\jupyterlabとドライブレターが複数指定されている件

volumesでするとどうしてもドライブレターが二度表示され、c:\cフォルダが必要であった。
これも解決できておらず、動くマシンではc:\cフォルダを掘っていた。

driver_optsの"type: none"と"o: bind"の意味

docker-composeのマニュアルや仕様には、その様な記載は見つけれなかった。
Compose Specification(仕様) — Docker-docs-ja 24.0 ドキュメント
github.com
しかし、Issueの対応に同じ記載を見つける事はでき、またどちらかを削ると動かなかった。
github.com

その他

  • WSL2の場合は、Docker Desktop for WindowsにShared Drivesという設定は存在しない。
  • Docker Desktop for Windowsをインストールしていても、docker-compose使うならあまり意味がない。コマンドを憶えるか、バッチファイルを作成して叩いて利用した方が良い。Docker Desktop for Windowsは起動・停止位の意味合いで利用すると割り切る。
  • Anacondaを使わなかったのは、ライセンス問題があるし、ちょこっと集計する程度に使えればいい位なので。

qiita.com

ハンガリアン記法とハンガリアン汚染

ハンガリアン記法

クラス名や変数名に特別な接頭字や接尾字を付与する事で、データ型情報・スコープなどが分かるようにするための命名
ハンガリアン記法にもアプリケーションハンガリアンとシステムハンガリアンが存在
アプリケーションハンガリアンは、実装をしている事で気づく様に仕向ける記法
(ex. 摂氏はc、華氏はfを付けるとしておけば、c_hoge1+ f_hoge2と実装しようとしているとおかしい事に気づける)
システムハンガリアンは、システム的に決まっているクラス名や変数名に対して、それを伝達する情報を付加すること
(ex. Javaのインタフェースなら接頭辞にIを付与、Javaの実装クラスなら)
ハンガリアン記法 - Wikipedia

ハンガリアン汚染

ハンガリアン記法が含まれてしまうこと
clean codeに記載有
moderatemisbehaviour.github.io

システムハンガリアンが嫌がられる理由(推測含む)

・クラス名や変数名の特徴を表す内容を変更したのに、名称を変更し忘れて意味が間違えてしまう事が多い
 (ex. BigDecimalからDoubleに変更したのに、BigDecimalを表す接頭辞を付与している)
・過去はIDEなどが無い、貧弱であったが、昨今ではそれらツールでカバーできる
 結果、可読性が落ちる
・上記ツールでカバーできる範囲なのに、無駄に覚えるべきルールが増える
・ソート順序が狂う

所感

  • 基本的にはハンガリアン汚染と呼ぶことに賛成(システムハンガリアン記法は不要)
  • アプリケーションハンガリアンは、みんなが守れるレベルの内容であればすべきだけど、拘りすぎると可読性を失う可能性あるかも
  • とはいえ、スタックトレースをぱっと読む際に、ハンガリアン記法で書かれていると便利な時は多い

 (eclipseはあんま昔からここ変わってないが、InteliJやNetBeansではうまくハンドリングしてくれるのやろか)

Azureのサブスクリプションに紐づけたライセンスの表示方法

【事象】
Azureポータルの検索で、ライセンスとか製品と入力しても、該当画面にたどりつけない

【対応方法】
以下を辿る(2021.2.19現在)
 Azure Active Directory → ライセンス → 管理 - すべての製品

上記ステップにより、Azure ADやWindows10など購入したライセンス一覧が現れる。

f:id:yoneyore:20210227192906j:plain
知らぬ間に検索できる様になっている可能性は高いかも