🤏
[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 psdocker container lsdocker container listdocker container ps
OPTIONS:
-
-a,--all動いてないやつも出す -
-q,--quietIDだけズラッと
便利コマンド
コンテナを一掃する
止まってるやつだけ
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/*
参照
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
参考
他のcontainer runtimeでも使えるイメージ名の書き方
例えばpodmanで compose.yaml を実行したい場合、そのままのイメージ名では実行できない。
debian:trixie を使うとすると docker.io/library/debian:trixie と書くと実行できる。
stakater/reloader などのユーザー名つきのイメージだと、docker.io/stakater/reloader と書く。
参考
実行
.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