🤏

[Docker] DockerのTips

に公開

はじめに

これは自分用です。
わかりにくいかもしれませんがご了承ください。

自分が知らないことがあったり、書き方忘れたときがあったら追記します。
間違ってますとか、追加してほしい的なコメント大歓迎です。

基本コマンド

コンテナをビルドする

docker build [OPTIONS] <PATH(Dockerfileがあるディレクトリ)>

  • -t "<イメージ名>:<タグ>" \cdots タグはなくてもいい
  • --ssh default=$SSH_AUTH_SOCK --mount=type=ssh のときに使う

コンテナを作成する

前提コンテナがビルド済みであること (参照: コンテナをビルドする)

docker create --name hoge_container fuga_image

コンテナのファイルをローカルにコピーする

docker cp temp_containers:/path/to/file ./file

動いているコンテナを取得

  • docker ps
  • docker container ls
  • docker container list
  • docker container ps

OPTIONS:

  • -a, --all 動いてないやつも出す
  • -q, --quiet IDだけズラッと

便利コマンド

コンテナを一掃する

止まってるやつだけ
docker container prune
-fをつけるとプロンプトが出ない

全部吹き飛ばす
docker rm -f $(docker ps -aq)

ビルド

Debian系のパッケージインストール

TODO: --mount=type=cacheを調べて追記する

# Dockerfile

# aptレポジトリをcdnに変更 (Debian)
RUN sed -i 's/deb.debian.org/cdn-fastly.deb.debian.org/g' /etc/apt/sources.list.d/debian.sources

# パッケージをインストール
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    # ここにインストールするパッケージ
    git ... && \
    rm -rf /var/lib/apt/lists/*

参照

https://docs.docker.com/build/building/best-practices/
https://httpredir.debian.org

alpine系のパッケージインストール

TODO: --mount=type=cacheを調べて追記する

# Dockerfile
RUN apk update
RUN apk add --no-cache <...package name>

Red Hat系のパッケージインストール

RUN --mount=type=cache,target=/var/cache/dnf,sharing=locked \
    dnf install -y \
    <...package name>

別のステージからファイルを持ってくる

# Dockerfile
COPY --from=builder /run-example-app /bin/

ビルド時にsshを使いたい(プライベートリポジトリなど)

RUN \
  mkdir -p -m 0600 ~/.ssh && \
  ssh-keyscan github.com >> ~/.ssh/known_hosts && \
  git config --global url."git@github.com:".insteadOf https://github.com/

RUN --mount=type=ssh ssh git@github.com

これ試してないから動くかどうかわからんけど多分動くと信じて

コマンドで実行する場合

docker build --ssh default

# 明示的にしたいとき
docker build --ssh default=$SSH_AUTH_SOCK

composeで実行する場合

# compose.yaml

service:
  <container-name>:
    build:
      ...
      ssh:
        - default

参考

https://qiita.com/j-yabu/items/8fb3ae7caee69292e706

他のcontainer runtimeでも使えるイメージ名の書き方

例えばpodmanで compose.yaml を実行したい場合、そのままのイメージ名では実行できない。

debian:trixie を使うとすると docker.io/library/debian:trixie と書くと実行できる。
stakater/reloader などのユーザー名つきのイメージだと、docker.io/stakater/reloader と書く。

参考

https://docs.podman.io/en/latest/Introduction.html

実行

.envから環境変数を設定したい

docker run --env-file .env
とか

# compose.yaml
service:
  container:
    ...
    env_file: .env
    #とか
    env_file:
      - .env
      - .env.dev

単一ファイルをread-onlyでマウント

docker run --mount type=bind,source=./data.json,target=/app/data.json,readonly <image name>

# volumeのほうがいい場合
docker run -v ./data.json:/app/data.json:ro <image name>

composeで、あるコンテナが起動したあとに起動させたい

# compose.yaml
service:
  db:
    image: example-db-image:latest
  db-required-backend:
    image: example-backend-image:latest
    depends_on: db

コンテナを自動起動させたい。

コマンドなら

--restart=alwaysをつけるだけでいい。

Composeなら

# compose.yaml
service:
  db:
    ...
    restart: always

Discussion