OCI CLI環境をDockerのコンテナで作る

## やりたいこと

コマンドライン(CLI)でOCI操作したいが、なんだか環境ごとにインストールするのが面倒だったり、
PythonのVersionに依存してエラーが出たりと面倒だったのでコンテナにしてみました。

## 参考

OracleのBlogを参考にしました。

[Get going quickly with Command Line Interface for Oracle Cloud Infrastructure using Docker container](https://blogs.oracle.com/developers/get-going-quickly-with-command-line-interface-for-oracle-cloud-infrastructure-using-docker-container)

## 環境準備

### ビルド用のファイルの作成

ビルド用のファイルを作成して配置します。

```bash-session
.
├── Dockerfile
└── requirements.txt
```

```Docker:Dockerfile
FROM python:3.6-alpine3.7

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --upgrade pip
RUN apk add --update alpine-sdk libffi libffi-dev openssl openssl-dev && pip install --no-cache-dir -r requirements.txt --no-use-pep517

COPY . .

ENTRYPOINT ["/usr/local/bin/oci"]
CMD []
```

```text:requirements.txt
oci
oci-cli
```

`--no-use-pep517`をつけているのはBlogに記載されている方法で実行すると以下のようなエラーが出ました。
回避策として`pip`引数に`--no-use-pep517`をつけています。  
どうやらpipのBugのようです。そのうちFixしそう。

<https://github.com/pypa/pip/issues/6197>

```bash-session
Exception:
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/pip/_internal/cli/base_command.py", line 176, in main
    status = self.run(options, args)
  File "/usr/local/lib/python3.6/site-packages/pip/_internal/commands/install.py", line 346, in run
    session=session, autobuilding=True
  File "/usr/local/lib/python3.6/site-packages/pip/_internal/wheel.py", line 886, in build
    assert have_directory_for_build
AssertionError
```

### イメージの作成

ファイルを配置したディレクトリに移動し、以下を実行。

```bash-sessiohn
docker build . -t ocicli
```

作成が完了するといかのような形でリポジトリに登録されます。

```bash-session
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
ocicli                latest              48a42d414ecd        7 seconds ago       311MB
python                3.6-alpine3.7       9b325f49dce0        3 days ago          74.2MB
```

### 設定ファイルとAPIキーの配置用ディレクトリの作成

```bash-session
mkdir ~/.oci
```

## 実行そして確認

### 設定ファイルとAPIキーの作成

```bash-session
$ docker run --rm --mount type=bind,source=$HOME/.oci,target=/root/.oci -it ocicli:latest setup config
    This command provides a walkthrough of creating a valid CLI config file.

    The following links explain where to find the information required by this
    script:

    User OCID and Tenancy OCID:

        https://docs.us-phoenix-1.oraclecloud.com/Content/API/Concepts/apisigningkey.htm#Other

    Region:

        https://docs.us-phoenix-1.oraclecloud.com/Content/General/Concepts/regions.htm

    General config documentation:

        https://docs.us-phoenix-1.oraclecloud.com/Content/API/Concepts/sdkconfig.htm


Enter a location for your config [/root/.oci/config]:
Enter a user OCID: ocid1.user.oc1.xxxxxxx
Enter a tenancy OCID: ocid1.tenancy.oc1.xxxxxx
Enter a region (e.g. ca-toronto-1, eu-frankfurt-1, uk-london-1, us-ashburn-1, us-phoenix-1): us-ashburn-1
Do you want to generate a new RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]: Y
Enter a directory for your keys to be created [/root/.oci]:
Enter a name for your key [oci_api_key]:
Public key written to: /root/.oci/oci_api_key_public.pem
Enter a passphrase for your private key (empty for no passphrase):
Private key written to: /root/.oci/oci_api_key.pem
Fingerprint: xxxxxxxxxxxxxxxx
Config written to /root/.oci/config


    If you haven't already uploaded your public key through the console,
    follow the instructions on the page linked below in the section 'How to
    upload the public key':

        https://docs.us-phoenix-1.oraclecloud.com/Content/API/Concepts/apisigningkey.htm#How2
```

Localにoci_api_keyができます。

```bash-session
$ ls -l ~/.oci/
total 40
-rw-------  1 ykoike  staff   296  1 30 00:55 config
-rw-------  1 ykoike  staff  1675  1 30 00:55 oci_api_key.pem
-rw-------  1 ykoike  staff   451  1 30 00:55 oci_api_key_public.pem
```

### API KEYの登録

APIキーの登録は[コマンドライン(CLI)でOCIを操作する - Oracle Cloud Infrastructureアドバンスド](https://community.oracle.com/docs/DOC-1019624)の「3-2. APIキーのアップロード」を参考にしてください。

### 試しにComputeのイメージをリストしてみる

出力が長いのでログは割愛しますが、成功しましたー。

```bash-session
docker run --rm --mount type=bind,source=$HOME/.oci,target=/root/.oci -it ocicli:latest compute image list -c ocid1.compartment.oc1.xxxxxxxxx
```

これでどの環境でもさっくりOCIのCLIを実行する環境が作れるはず。

### おまけ　ショートカットコマンドを作成する

profileなどに以下を記載して読み込ませることで、いちいちdockerコマンドを打たなくて済みます。

```bash-session
oci() {docker run --rm --mount type=bind,source=$HOME/.oci,target=/root/.oci -it ocicli:latest "$@"; }
```

```bash-session
oci --version
2.4.42
```