A certain engineer "COMPLEX"

開発メモ その177 Visual Studio Code Remote SSHでつながらない

Introduction


メモ。

Why?


ssh.config の場所が悪い

接続に失敗した際、出力コンソールに下記のようなログが出ていました。


remote-ssh@0.44.0
win32 x64
SSH Resolver called for "ssh-remote+7b22686f73744e616d65223a223139322e3136382e31312e31315b5562756e74755f31382e30342e325f4c54535d222c2275736572223a22742d74616b6575636869227d", attempt 1
SSH Resolver called for host: t-takeuchi@192.168.11.11[Ubuntu_18.04.2_LTS]
Setting up SSH remote "192.168.11.11[Ubuntu_18.04.2_LTS]"
Using commit id "0f3794b38477eea13fb47fbe15a42798e6129338" and quality "stable" for server
Testing ssh with ssh -V
ssh exited with code: 0
Got stderr from ssh: OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
Using SSH config file "C:\Users\TAKUYA\Dropbox\Settings\Visual Studio Code\Remote Development\ssh.config"
Install and start server if needed
> Can't open user config file C:\\XXXX\\Visual: No suc
> h file or directory
> プロセスが、存在しないパイプに書き込もうとしました。
>
"install" terminal command done
Received install output: プロセスが、存在しないパイプに書き込もうとしました。
Failed to parse remote port from server output: プロセスが、存在しないパイプに書き込もうとしました。

ログを書き込もうとしたら、書き込みに失敗したもよう。
原因がssh.configをおいたパスに空白が含まれている、ということ。

それくらい対処してくださいよ、Microsoftさん。

Windowsの環境変数なんてしらない


remote-ssh@0.44.0
win32 x64
SSH Resolver called for "ssh-remote+192.168.11.11", attempt 1
SSH Resolver called for host: 192.168.11.11
Setting up SSH remote "192.168.11.11"
Using commit id "0f3794b38477eea13fb47fbe15a42798e6129338" and quality "stable" for server
Testing ssh with ssh -V
ssh exited with code: 0
Got stderr from ssh: OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
Using SSH config file "C:\XXXX\ssh.config"
Install and start server if needed
>
> percent_expand: unknown key %U
> プロセスが、存在しないパイプに書き込もうとしました。
>
"install" terminal command done
Received install output: プロセスが、存在しないパイプに書き込もうとしました。
Failed to parse remote port from server output: プロセスが、存在しないパイプに書き込もうとしました。

ssh.confgで秘密鍵のファイルパスに環境変数%USERPROFILE%を使おうとしたためです。
環境変数は使わないほうがよいでしょう。

OSXにつながらない


remote-ssh@0.44.0
win32 x64
SSH Resolver called for "ssh-remote+7b22686f73744e616d65223a224d61634d696e69283139322e3136382e31312e3829227d", attempt 1
SSH Resolver called for host: MacMini(192.168.11.8)
Setting up SSH remote "MacMini(192.168.11.8)"
Using commit id "0f3794b38477eea13fb47fbe15a42798e6129338" and quality "stable" for server
Testing ssh with ssh -V
ssh exited with code: 0
Got stderr from ssh: OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
Using SSH config file "C:\XXXX\ssh.config"
Install and start server if needed
>
> Password:
"install" wrote data to terminal: "**********"
>
>
> sed: 1: "s/^linux //gi": bad flag in substitute command: 'i'
> Unsupported architecture:
> a223db13-3bae-4f5f-ab69-b2f577125593##27##
>
"install" terminal command done
Received install output: a223db13-3bae-4f5f-ab69-b2f577125593##27##
Unsupported architecture
The remote server architecture is not supported
------

OSXはFrerBSDの派生です。
sedコマンドはFreeBSDとLinuxではコマンドが異なります。
公式を確認してもOSXが使えない、という表記が見つかりませんでしたが、おそらくダメでしょう。

開発メモ その176 Docker Jenkins in Synology NAS

Introduction


JenkinsをSynology NASに構築したのでメモ。
Slaveノードは別マシンに構築します。

How to?


用意するもの

jenkinsのディレクトリを用意します。
これらはdockerコンテナにマウントされます。
今回は下記をマウントします。

  • /docker/jenkins/jenkins_home
  • /docker/jenkins/share/jenkins
  • /docker/jenkins/share/jenkins/ref

そして権限を変更します。


$ sudo chown -R 1000 /volume1/docker/jenkins

Jenkinsのダウンロード

dockerの場合、コンテナ内のデータは破棄されてしまうため、Jenkins本体をマウントする形にすることでアップデートできるようにします。

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

Generic Java package (.war)をダウンロードし、Jenkins.war/docker/jenkins/share/jenkinsにコピーします。

キーストアの作成

HTTPSで接続するために作成します。既にLet's Encryptで証明書は発行済みであるものとします。
HTTPで良い場合は、必要ありません。

Javaをインストールする必要があるのでパッケージ センターからインストールします。

パッケージ センター

インストール後のパス

続いて、下記のシェルをsudoで実行します。


#!/bin/bash

KEYROOT=/usr/syno/etc/certificate/system/default
KEY_PEM=${KEYROOT}/privkey.pem
CERT_PEM=${KEYROOT}/cert.pem
JAVA_HOME=/var/packages/Java7/target/j2sdk-image/jre/bin
KEYSTORE=/volume1/docker/jenkins/jenkins_home/keystore

openssl rsa -des3 -in $KEY_PEM -out key.encrypted.pem
openssl pkcs12 -inkey key.encrypted.pem -in $CERT_PEM -export -out keys.encrypted.pkcs12
${JAVA_HOME}/keytool -importkeystore -srckeystore keys.encrypted.pkcs12 -srcstoretype pkcs12 -destkeystore $KEYSTORE

下記のように実行します。
パスワードの空文字は許容されません。


$ sudo ./generate_jenkins_keystore.sh
writing RSA key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Enter pass phrase for key.encrypted.pem:
Enter Export Password:
Verifying - Enter Export Password:
Importing keystore keys.encrypted.pkcs12 to /volume1/docker/jenkins/keystore_...
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
Entry for alias 1 successfully imported.
Import command completed: 1 entries successfully imported, 0 entries failed or cancelled

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /volume1/docker/jenkins/keystore_ -destkeystore /volume1/docker/jenkins/keystore_ -deststoretype pkcs12".

コンテナの作成

キーストア作成の時に入力したパスワードを指定してコンテナの起動を実行します。
ホスト側のポートは適宜変更します。
HTTPで良い場合は、--httpから始まる引数を削除します。


$ sudo docker run -v /volume1/docker/jenkins/jenkins_home:/var/jenkins_home \
-v /volume1/docker/jenkins/share/jenkins:/usr/share/jenkins \
-p 38080:8443 \
-p 50003:50000 \
--name jenkins \
jenkins/jenkins:alpine \
--httpPort=-1 \
--httpsPort=8443 \
--httpsKeyStore=/var/jenkins_home/keystore \
--httpsKeyStorePassword=

コンソールが流れてしばらくするとadminの初期パスワードが表示されますのでメモしておきます。


*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

b0c58624703945a3ba1517b556b0f1bc

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

初期設定

ブラウザからアクセスします。

Jenkinsのアンロック。メモした初期パスワードを入力

Jenkinsのアンロック

プラグインのインストール。Install suggested plugins を選択

インストール中

ユーザ登録。入力後、Save and Finish

準備完了

開発メモ その175 Docker Registry in Synology NAS

Introduction


Dockerイメージを保存するプライベートなDocker RegistryをSynology NASに構築したのでメモ。
Docker Registryもdockerコンテナとして動作します。

How to?


用意するもの

設定ファイル、イメージを格納するディレクトリを用意します。
これらはdockerコンテナにマウントされます。
今回は下記をマウントします。

  • /docker/registry/config/config.yml
  • /docker/registry/config/htpasswd
  • /docker/registry/images
  • /docker/registry/certs

/docker/registry/config/config.yml


version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true # open delete api
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
auth:
htpasswd:
realm: basic-realm
path: /auth/htpasswd # use apache basic-auth

/docker/registry/config/htpasswd

registryへのログインパスワードを格納するファイルです。
下記のようにdockerコンテナに作らせます。


$ docker run --rm -ti xmartlabs/htpasswd > htpasswd

/docker/registry/images

dockerイメージの保存先です。
ただのフォルダです。

/docker/registry/certs

sslのための証明書、.crt、.keyを格納しておきます。
Let's Encryptが更新されたらここを更新します。

HTTPSでregistryにアクセスするのが基本です。ここを設定しなくても利用はできますが、dockerの設定で信頼できないregistryにアクセスできるよう設定を追加する必要があるので、ここはきちんと設定しておきます。

コンテナ作成

registryをpullします

pullできました

コンテナを作成します

詳細設定のボリューム

詳細設定のポート設定

詳細設定の環境

以上で完成です。

動作確認

コンテナを起動後、dockerからログインできるかどうかを確認します。
ポート番号を確認し下記のように確認しておきます。
usernameとpasswordは最初に作ったhtpasswdファイルで作成した情報になります。


> docker login https://hogehoge:28009/
Username: xxxxxx
Password:
Login Succeeded

もしssl設定をしていない場合は下記のようになりますので、クライアント側でdockerの設定を変更しておきます。


> docker login http://192.168.11.17:28009
Username: xxxxxx
Password:
Error response from daemon: Get https://192.168.11.17:28009/v2/: http: server gave HTTP response to HTTPS client

開発メモ その174 WindowsコンテナとLinuxコンテナを共存させる

Introduction


前回はシステムで利用するコンテナをWindowsからLinuxコンテナ、その逆と切り替えてみました。

How to


まずWindowsコンテナに切り替えます。
そしてExperimentalを有効化します。

Linux イメージを動かしてみる

alpineコンテナが動いています。
ホストのディレクトリもマウントできています。


> docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.24)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:28:48 2019
OS/Arch: windows/amd64
Experimental: true
> docker run --rm -v c:/Users:/data alpine ls /data
All Users
Default
Default User
DefaultAppPool
Public
TAKUYA
desktop.ini

Windowsイメージ

Windows Server Corealpineが表示されています。


>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nvidia/cuda 10.0-cudnn7-devel-ubuntu16.04 c963dc0723b7 8 days ago 3.17GB
nvidia/cuda 9.2-cudnn7-devel-ubuntu16.04 fa48202870f2 8 days ago 3.09GB
mcr.microsoft.com/windows/servercore 1809-amd64 43c05724e30b 2 weeks ago 4.56GB
ubuntu 16.04 2a697363a870 3 weeks ago 134MB
alpine latest 055936d39205 4 weeks ago 6.28MB

まとめ

Windowsコンテナに切り替えればイメージを共存されることができました。
ドライブの共有も問題なしです。

開発メモ その173 WindowsコンテナとLinuxコンテナを切り替える

Introduction


Docker for Windowsでコンテナを切り替えてみました。
環境はこんな感じです。

How to


特に難しいことはありません。
タスクトレイのSwitch to Windows containers...をクリックするだけです。

Linux から Windows へ

切り替えた直後です。
イメージが消えています。ちょっと驚きます。


>docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.24)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:28:48 2019
OS/Arch: windows/amd64
Experimental: false

C:\Users\TAKUYA>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE

Windows から Linux へ

戻してみます。
イメージが戻っています。


>docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: true

C:\Users\TAKUYA>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/core/sdk 2.1-bionic 28d5b1e8a03b 2 weeks ago 1.7GB
mcr.microsoft.com/dotnet/core/runtime 2.1-bionic 51c475cc6ed8 2 weeks ago 194MB
ubuntu latest 7698f282e524 3 weeks ago 69.9MB
nvidia/cuda 10.0-cudnn7-devel-centos6 1d245213a2c9 2 months ago 2.88GB
nvidia/cuda 10.0-cudnn7-devel-ubuntu16.04 e1d637677e0d 2 months ago 3.08GB
centos 7 9f38484d220f 2 months ago 202MB
ubuntu 16.04 7e87e2b3bf7a 4 months ago 117MB
ubuntu 14.04 5dbc3f318ea5 4 months ago 188MB
ubuntu 18.04 20bb25d32758 4 months ago 87.5MB
alpine edge dacde26455ab 5 months ago 5.28MB
alpine latest 3f53bb00af94 5 months ago 4.41MB
nvidia/cuda 9.2-cudnn7-devel-ubuntu16.04 7affc4c2ce61 6 months ago 2.9GB
nvidia/cuda 9.2-cudnn7-devel-centos6 b26377b9a39a 7 months ago 2.82GB
docker4w/nsenter-dockerd latest 2f1c802f322f 7 months ago 187kB
centos 6.10 30e66b619e9f 8 months ago 194MB

まとめ

イメージを共存することはできませんが、切り替えたからと言って前の環境に戻せなくなる、ということはありません。