Docker containerのFOSSologyからhost OS上のPostgreSQLにアクセスする

FOSSology は、ソースコードをスキャンしてオープンソースソフトウェア (OSS) のライセンスや著作権などの情報を検出するソフトウェアであり、OSS ライセンスのコンプライアンス遵守にとても有効なツールです。FOSSology は Docker image としても提供されていますが、スキャンした結果を保存するデータベースはコンテナの外部に用意することが推奨されています。そこで、Docker container 上の FOSSology から host OS (Debian 9) 上の PostgreSQL データベースにアクセスする方法を試してみました。この記事が、FOSSologyを使ってみたい方々の手助けになることを希望します。

FOSSology is a toolset that scans source code and detects OSS licenses and copyright information. It is a very useful tool for OSS license compliance. This article is intended to help beginners of FOSSology install and setup FOSSology on Docker container with an external PostgreSQL server running on the host OS (Debian 9).

## 目次
1. 前提条件
2. Docker CE のインストール
3. FOSSology を動かしてみる
4. PostgreSQLのインストール
5. FOSSology を起動する

### Content
1. Prerequisite
2. Installation of Docker CE
3. Run FOSSology (stand-alone)
4. Installation of PostgreSQL and creation of a DB
5. Run FOSSology (accessing PostgreSQL on the host OS)

## 1. 前提条件
ここに記載の内容は、以下の環境で試したものです。
The content written in this article was tested under the following environment.

|item |Description |
|--- | --- | ---|
|Host OS |Debian 9 (Stretch)|
|Network |Broadband access to the Internet|
|CPU |Intel(R) Core(TM) i3-3220T CPU @ 2.80GHz|
|RAM |4GB|

## 2. Docker CE のインストール
Host OS である Debian に Docker CE をインストールします。以下のサイトの手順に従いますが、apt-get の代わりに apt で OK です。
https://docs.docker.com/install/linux/docker-ce/debian/
ここではコマンドのみを列挙しますので、詳細は上記サイトを参照してください。

This section shows how to install Decker CE on Debian (host OS). Here is just a list of commands for installing Docker CE. Please refer to the above site for the detailed descriptions.

```
$ sudo apt remove docker docker-engine docker.io
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
$ sudo apt update
$ sudo apt install docker-ce
```
一般ユーザの権限で Docker を起動できるように、ユーザ名を docker グループに追加します。設定を反映させるには、コマンドの実行後、一旦ログアウトが必要なようです。

This command adds you to "docker" group so that you can run Docker without the root privilege. It seems that logout is required for this to take effect.

```
$ sudo gpasswd -a ${USER} docker
```
Hello-world イメージを実行してみて、Docker が正しくインストールされたことを確認します。

Run the hello-world image to see if Docker is installed correctly.

```
$ docker run hello-world
```
## 3. FOSSology を動かしてみる

以下のコマンドにより、あらかじめビルドされた Docker image を起動することができます。初回には、イメージを Dockerhub からダウンロードするのにいくらか時間がかかります。

Following command runs a pre-built image of FOSSology from Dockerhub. It takes some time to download the docker image for the first time.

```
$ docker run -p 8081:80 fossology/fossology
```
Webブラウザから http://IP_OF_DOCKER_HOST:8081/repo にアクセスしてみてください。デフォルトのユーザ名/パスワードは、fossy/fossy です。
参考URL：https://hub.docker.com/r/fossology/fossology/

Access http://IP_OF_DOCKER_HOST:8081/repo from your web browser. User fossy and password fossy.
cf. https://hub.docker.com/r/fossology/fossology/

なお、ここまでの手順は、こちらの方の記事と基本的には同じです。
https://qiita.com/kanpapa/items/b2e771022e7fcc53532b

ここまでの手順では FOSSology はコンテナ内部のデータベースを使用しており、スキャンした結果の保存は保証されません。そこで、次項で、外部データベースを使用する設定を行います。ここでは、docker ps コマンドで現在実行中のContainer IDを調べ、docker stop コマンドで上で起動したコンテナを停止します。

At this point, FOSSology uses the internal database without data persistency. Check the container ID by "docker ps" command and then stop the container with "docker stop" command.

```
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMES
4a05838bafc4        fossology/fossology   "/fossology/docker-e…"   20 seconds ago      Up 18 seconds                           romantic_wu
$ docker stop 4a05838bafc4
```
## 4. PostgreSQLのインストールとデータベース作成

### 4.1 PostgreSQLのインストール

ホストOSにPostgreSQLをインストールします。
Install PostgreSQL onto the host OS.

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install postgresql
```
### 4.2 ホストOS上で postgres ユーザのパスワードを設定

ホストOS上でpostgresユーザのパスワードを設定します。パスワードは任意です。
Set a password for "postgres" user. The password is arbitrary.

```
$ sudo passwd postgres
```

### 4.3 データベースの作成
上記で設定したパスワードで "postgres" としてログインし、データベース "fossology" を作成します。続けて、データベースのユーザ "fossy" を作成します。パスワードは "fossy" を設定します。

Login as "postgres" and create a database "fossology". Then create a user "fossy" on the database with a password "fossy".

```

$ su - postgres
$ createdb fossology
$ createuser --pwprompt --interactive fossy
Enter password for new role: # Enter fossy here.
Enter it again: # Enter fossy here.
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
```
## 5. FOSSology を起動する

以下のコマンドでFOSSologyを起動します。今回は "-p 8081:80" は不要です。付けても無視されます。

Start FOSSology with the following command. This time, "-p 8081:80" is not needed. (Discarded even if added)

```
$ docker run --network="host" -e FOSSOLOGY_DB_HOST="127.0.0.1" fossology/fossology
```
-e FOSSOLOGY_DB_HOST="localhost" や -e FOSSOLOGY_DB_HOST="192.168.x.y" では動作しませんでした。

Neither -e FOSSOLOGY_DB_HOST="localhost" nor -e FOSSOLOGY_DB_HOST="192.168.x.y" ,for example, worked.

Webブラウザから http://IP_OF_DOCKER_HOST/repo/ にアクセスしてください。つまり、ポート番号は80番になります。

Access http://IP_OF_DOCKER_HOST/repo/ from your web browser. The port number is 80 this time.