Podmanで遭遇したトラブルシューティング

[公式のトラブルシューティング][trouble] でより多くの事例・詳細が紹介されてます。
本記事はそれとは別に自分が遭遇した（メモしてた）ものだけ紹介。

- Fedora 30
- podman 1.4.2 ~ 1.7.0  
  （途中でバージョン上げたので混在しちゃってます…）

## ボリュームマウント時に `Permission Denied`

もしかして： _SELinux_ が有効

&#x1F4A1; `podman run` コマンドのマウントオプションで `:Z` をつければいい。
（`-v <HOST DIR>:<CONTAINER DIR>:Z` とする）

```shell:大丈夫な例
$ podman run --rm -v ${PWD}:/local:Z openapitools/openapi-generator-cli generate \
    -i https://raw.githubusercontent.com/openapitools/openapi-generator/master/modules/openapi-generator/src/test/resources/2_0/petstore.yaml \
    -g go \
    -o /local/out/go
```

- [Permission denied mounted volume with userns=keep-id · Issue #3415 · containers/libpod](https://github.com/containers/libpod/issues/3415)

## ポートマッピングでエラー

もしかして： ウェルノウンポート（ `0-1023` ）を対象

非 `root` でコンテナを起動した場合はウェルノウンポートへのマッピングができない。

```shell:非rootでウェルノウンポートをマッピングしようとした場合のエラー例
$ podman run --rm -i -t -p 80:8080 test/openapi
ERRO[0000] unable to remove container 844ffd8da76db8b29e64a7cb50a6661f49aaee4091464da1139f014f71839330 after failing to start and attach to it
Error: error from slirp4netns while setting up port redirection: map[desc:bad request: add_hostfwd: slirp_add_hostfwd failed]
```

&#x1F4A1; `1024` 番ポート以降を利用するか、`root` でコンテナを起動する（`sudo podman run ...`）。

## ping が通らない

もしかして： 非 `root` でコンテナを起動している

非 `root` でコンテナを起動した場合、権限がなくて `ping` は失敗する。

&#x1F4A1; 権限なしの `ping` を有効にするには、ホスト上でユーザーの UID を 
`cat /proc/sys/net/ipv4/ping_group_range` の範囲内にする必要がある。
具体的には以下の設定をすればいい（値 `65535` は許可したい UID の範囲に合わせる）。

- 一時的な変更

    ```shell
    sudo sysctl -w "net.ipv4.ping_group_range=0 65535"
    ```

- 永続的な変更

    `/etc/sysctl.d/` 以下に `net.ipv4.ping_group_range=0 65535` 行を含むファイルを配置する。

## 名前解決できない

もしかして： ファイアウォールによる制限

&#x1F4A1; ホスト側のコンテナ用インタフェース `cni-podman0` に対してファイアウォールで許可する。

```shell
iptables -t filter -I FORWARD -i cni-podman0 ! -o cni-podman0 -j ACCEPT
```

firewalld でやる例

```shell
$ sudo firewall-cmd --zone=internal --change-interface=cni-podman0 --permanent
$ sudo firewall-cmd --zone=internal --add-source=10.88.0.0/16 --permanent
$ sudo firewall-cmd --reload
```

## コンテナの IP 設定について確認したい

&#x1F4A1; ホストの `/etc/cni/net.d/87-podman-bridge.conflist` ファイルに `podman` の CNI 設定が記述されている。
デフォルトだと `10.88.0.0/16` の範囲で IP アドレスが割り当てられている。

```shell:/etc/cni/net.d/87-podman-bridge.conflistの一部抜粋
{
    "type": "bridge",
    "bridge": "cni-podman0",
    "isGateway": true,
    "ipMasq": true,
    "ipam": {
        "type": "host-local",
        "routes": [
            {
                "dst": "0.0.0.0/0"
            }
        ],
        "ranges": [
            [
                {
                    "subnet": "10.88.0.0/16",
                    "gateway": "10.88.0.1"
                }
            ]
        ]
    }
},
```

ホスト側は `cni-podman0` インタフェースが作成されて割り当てられる。

```shell
$ ip addr show dev cni-podman0
3: cni-podman0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ae:a9:ea:22:f3:4a brd ff:ff:ff:ff:ff:ff
    inet 10.88.0.1/16 brd 10.88.255.255 scope global cni-podman0
       valid_lft forever preferred_lft forever
    inet6 fe80::aca9:eaff:fe22:f34a/64 scope link
       valid_lft forever preferred_lft forever
```

### CNI ネットワークが（`cni-podman0` インタフェースも）ない

&#x1F4A1; 一度 `root` 権限でコンテナを起動すると作成されるはず。

## Dockerプライベートレジストリに `podman push` できない

もしかして： 使用プロトコルが _HTTP_

```shell:エラーメッセージを読むとHTTPS通信を要求している
$ podman push localhost:5000/my_gitbucket
Getting image source signatures
Error: Error copying image to the remote destination: Error trying to reuse blob sha256:a1aa3da2a80a775df55e880b094a1a8de19b919435ad0c71c29a0983d64e65db at destination: pinging docker registry returned: Get https://localhost:5000/v2/: http: server gave HTTP response to HTTPS client
```

&#x1F4A1; `--tls-verify=false` オプションを設定する（デフォルトで `true` になっており、 HTTPS 通信を要求される）。

```shell:HTTP通信でpush
podman push --tls-verify=false localhost:5000/my_gitbucket
```

## `docker-compose.yml` を扱いたい

&#x1F4A1; [podman-compose][compose] をインストールして使う。

```shell:インストール
$ pip3 install --user podman-compose
```

```shell:使用例
$ podman-compose -f docker-compose.yml up -d
$ podman-compose -f docker-compose.yml down
```

`podman-compose` は `podman` をバックエンドとして `docker-compose.yml` を実行可能にする。

- _rootless_ で起動可能
- `podman` と Python3 および PyYAML のみに依存
- デーモンなし、セットアップなし

## 参考

- [containers/libpod](https://github.com/containers/libpod)
- [Troubleshooting - containers/libpod][trouble]
- [Podman, DNS, and CNI](https://medium.com/cri-o/podman-dns-and-cni-5ca9cc8cc457)
- [containers/podman-compose][compose]

[trouble]: https://github.com/containers/libpod/blob/master/troubleshooting.md
[compose]: https://github.com/containers/podman-compose