Dockerチートシート

Dockerとか使いたくないんやが・・・😇

# Dockerのインストール

```shell-session
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
```

一般ユーザで`docker`コマンドを使えるようにするには、さらに、

```sh
sudo usermod -aG docker pi
```

を実行してからいちどログアウトする。

ただしこれは、sudoのようなもので、dockerコンテナが起動されるのはdockerdが起動しているユーザの権限になる。
本当にユーザ権限でdockerコンテナを起動したい場合は、後述の「ユーザ権限でコンテナを起動する」で紹介しているrootless dockerを使用する。

# Dockerfileの書き方

```Dockerfile
FROM debian:buster

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get -y update && \
    apt-get -y install make && \
    rm -rf /var/lib/apt/lists/*

COPY . /workdir/

WORKDIR /workdir

CMD make help
```

# イメージをビルドする

`buildroot`というタグのついたイメージをビルドするには、

```sh
docker build -t buildroot .
```

# build context からファイルを除外する

`.dockerignore`を使う。

下記のような`.dockerignore`が存在する状態で`docker build`すると、`app`ディレクトリだけが build context に含まれるようになる。

```.dockerignore:.dockerignore
*
!app
*/.*.swp
```

上記の例だと、

- 全部除外する
- `app`だけ含める
- 任意のディレクトリにある`.*.swp`というファイル（vimのswapファイル）を除外する

# コンテナの起動してシェルを実行する

- `--name`を指定しない場合は自動生成されたコンテナ名が使用される

```sh
docker run -it --name container_name image_name /bin/bash
```

# 停止したコンテナを再度起動する

- `run`したときに指定したコマンドが実行される（はず）

```sh
dokcer start -i container_name
```

# 起動中のコンテナで新たにシェルを実行する

- `--login`オプションをつけないと`/etc/profile`などを読み込んでくれない模様

```sh
docker exec -it container_name /bin/bash --login
```

https://ja.stackoverflow.com/questions/22379/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%A6%E3%82%82-bash-profile%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84

# ホストから起動中のコンテナにファイルをコピーする

- `etc/apt/trusted.gpg`をコンテナ名`wizardly_shockley`のコンテナの`/root`以下にコピーする

```sh
docker cp etc/apt/trusted.gpg wizardly_shockley:/root
```

# シェルの履歴補完がきかない

https://qiita.com/Yuki-Inoue/items/60ec916383025160fbb8
detach keyがデフォルトでCtrl+Pに割り当てられてるのが原因っぽい。
なぜそこに割り当てたんだ・・・


# ユーザ権限でコンテナを起動する

Rootless Dockerが既にリリース版にはいっているのでこれを使う。

```shell-session:もちろん一般ユーザで
$ curl -fsSL https://get.docker.com/rootless | sh
```

インストール後に表示される指示に従ってパスを追加したら、あとはふつうに`docker build`とか`docker run`とかが使える。
[pi-gen](https://github.com/RPi-Distro/pi-gen)のような、binfmt-miscを使うコンテナがうまく動かなかった。（やり方がわるいだけかもしれないが）


# bashでdockerコマンドの入力補完

- Docker for Mac にバンドルされているものを使うとよいらしい

```
ln -s /Applications/Docker.app/Contents/Resources/etc/docker.bash-completion /usr/local/etc/bash_completion.d/docker
```

from: http://uorat.hatenablog.com/entry/2017/02/01/163027


# `--platform` でサポートされているアーキテクチャの一覧を見る

本当にこれでいいのか・・・？

```shell-session
$ docker buildx ls
NAME/NODE       DRIVER/ENDPOINT STATUS  PLATFORMS
desktop-linux * docker                  
  desktop-linux desktop-linux   running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default         docker                  
  default       default         running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
```

# マルチアーキテクチャでビルドしてdocker hubにpushする

```sh
docker buildx create --use
docker buildx build --push --platform linux/amd64,linux/arm64,linux/arm/v7 --tag miminashi/legacy_chat:latest .
```