Posted:
| Categories:
Gentoo
| Tags:
distcc,
docker,
Gentoo
背景
Gentoo の Docker イメージが作りたい。が、
- オフィシャルの gentoo/stage3-amd64 の更新頻度が低い( 2021/08/08 時点で以前のアップデートが 1 年前だった )
- portage 用のイメージ gentoo/portageがあり、こちらは毎日更新されている。
- コマンドや glibc などが置かれているビルド済みの領域は gentoo/stage3-amd64 に置かれているため、実際に使うときには emerge –update –deep –newuse @world とリビルドが必要
- リビルドするとイメージのサイズがかなり増える
が、できればコンパクトなイメージにしたい。
結論(2021/08/17 時点)
docker-slimを使ってイメージをコンパクトにする方法が一番コンパクトになった。
| 手法 | サイズ | 備考 |
|---|
| ダウンサイジング前 | 3.04GB | |
| 不要なディレクトリの削除 | 1.8GB | emerge が一時的に使うファイル郡 |
| (上記ディレクトリ削除に加えて)不要なパッケージの削除 | 983MB | パッケージ一覧を見ながら不要そうなパッケージを削除 |
| docker-slim | 39MB | |
Dockerfile サンプル
ここに公開した
手法の比較
不要なディレクトリ削除は emerge が一時的に使うファイル郡を削除するだけなので安全に使える。
不要なパッケージの削除だが、これはパッケージ名の変更やパッケージ同士の依存関係の変更があると
必須ではないが、都度 Dockerfile の修正が必要になり長期間の運用を考えると、運用コストが上がる。
docker-slim を使った方法が一番コンパクトになった。ただ docker-slim は必要なファイルを動的に解析して必要なファイルのみを残すので、解析できるように準備する必要がある。
RUN emerge –sync でも同様な事はできるので… と思ったが、毎回 emerge –sync に時間が取られるのは無駄。
もし「Docker のキャッシュで古い状態でビルドされるのが嫌だ」という場合でも、キャッシュを使わないオプションで docker build すれば最新の状態でビルドできる。
Read more...Posted:
| Categories:
cheatsheet
| Tags:
cheatsheet,
docker
| やりたいこと | コマンド | 備考 | |
|---|
| Github Container Registry にログイン | `echo $CR_PAT | docker login ghcr.io -u exampleuser –password-stdin` | 環境変数 $CR_PAT にパーソナルアクセストークンが入っているものとする 参考 |
| イメージのリストアップ | `docker images | tac` | |
| タグ付け | docker tag イメージID ghcr.io/exampleuser/genpi64-distcc-docker:latest | | |
| push | docker push ghcr.io/exampleuser/genpi64-distcc-docker:latest | https://github.com/[GithubのID]?tab=packages で docker レポジトリにアクセス可能 | |
| ポート開いて実行 | docker run -p 3632:3632 ghcr.io/exampleuser/genpi64-distcc-docker:latest | | |
Read more...Posted:
| Categories:
cheatsheet
| Tags:
cheatsheet,
docker,
docker-slim
| オプション | 効果 |
|---|
| –state-path | docker-slim の状態が保持されるパス、docker-slim コマンドが書き込めるパスにする |
| –target | 元のイメージ |
| –tag | スリムになったイメージのタグ |
| –http-probe | デフォルトは enable、ただ distcc の場合、HTTP ポートではないので false にしている |
| –exec | docker-slim が動的にアプリケーションの振る舞いを解析する際に実行するシェルスクリプト |
例
time docker build . -t genpi64-distcc-large:latest
docker-slim --state-path ~/tmp/docker-slim build --target genpi64-distcc-large:latest --tag ghcr.io/exampleuser/genpi64-distcc-docker:latest --http-probe=false --exec "/need.bash"
docker push ghcr.io/exampleuser/genpi64-distcc-docker:latest
参考
オフィシャル
Read more...Posted:
| Categories:
docker
| Tags:
docker,
Dockerfile
リファレンス
オフィシャル
Dockerfile の見直す時に参考にする場所
Dockerfile のベストプラクティス
その 1
)
下記以外にもあるが私が忘れやすいポイントだけ
- .dockerignore ファイルを使う
- レイヤの数を最小に
- 複数行の引数 <= 引数はアルファベット順に
- 構築キャッシュ <= docker build で –no-cache=true とすると既存キャッシュを使わない
- CMD <= 常に CMD [“executable”, “param1”, “param2”…] のような形式で使うべきです。
- WORKDIR <= 明確さと信頼性のため、常に WORKDIR からの絶対パスを使うべきです。
- Distroless が使えないか検討する
その 2
- LABEL <= ロジェクト内でのイメージ管理をしやすくしたり、ライセンス情報の記録や自動化の助けとするなど、さまざまな目的があります。
参考
現実に効果的な Dockerfile を書くためには、
いつもながらトリッキーなシェルのテクニックや、
レイヤーができる限り小さくなるようなロジックを考えたりすることが必要でした。
つまり各レイヤーは、それ以前のレイヤーから受け継ぐべき生成物のみを持ち、
他のものは一切持たないようにすることが必要であったわけです。
本来 2 つあるRUNコマンドを Bash の&&オペレーターによって連結しています。
これを行うことで、イメージ内に不要なレイヤーが生成されることを防いでいます。
ただこれでは間違いを起こしやすく、保守もやりづらくなります。
保守がやりづらくなる、という認識は docker にもあるようだ。
Read more...Posted:
| Categories:
docker
| Tags:
docker,
security
Privileged(特権)ではない方法で、必要な分だけセキュリティを緩める
背景
Privileged(特権)を持った Docker コンテナは root 権限を備えたコンテナであり、
2021 年の Docker では Linux のセキュリティコンピューティングモード(secure computing mode; seccomp)と呼ばれる機構で制限がかけられている。
現在は 300 以上あるシステムコールのうち 44 が制限されている。
どのように制限をかけるか簡単に確認してみた。
環境
docker-compose の実行は Ubuntu Studio 21.04
コンテナは gentoo/stage3-amd64
docker-compose.yml に追加
- 制限する profile.json の雛形をダウンロード
- 雛形を修正
- docker-compose.yml 修正
- docker-compose を起動し直し
手順
wget https://raw.githubusercontent.com/moby/moby/master/profiles/seccomp/default.json
default.json を確認する。このリストはホワイトリストで、このリストに含まれていない場合、ブロックされる。
つまり「何か権限が足りない場合」、「このリストに追加」したい。
ただ 2021/08/04 に確認した所、 CAP_SYS_PTRACE に process_vm_readv は追加されていたので、
一旦、修正は加えず、 profile.json を持ちいて起動するように docker-compose.yml を修正して起動する。
docker-compose の修正
version: "3"
services:
distcc:
build:
context: ./
container_name: 'distcc'
security_opt: # <= security_opt を追加
- seccomp:default.json # <= docker-compose.ymlと同じディレクトリにjsonファイルを置いた
command: >
bash -c "/bin/bash"
volumes:
- ./make.conf:/etc/portage/make.conf
発生していたエラー
/var/tmp/portage/sys-libs/glibc-2.33-r1/work/build-x86-x86_64-pc-linux-gnu-nptl/elf/sln /var/tmp/portage/sys-libs/glibc-2.33-r1/work/build-x86-x86_64-pc-linux-gnu-nptl/elf/symlink.list
* /var/tmp/portage/sys-apps/sandbox-2.18/work/sandbox-2.18/libsandbox/trace.c:do_peekstr():134: failure (Operation not permitted):
* ISE:do_peekstr:process_vm_readv(104259, 0x00007ffe29debd20{0x00007fd68a110010, 0x535}, 1, 0x00007ffe29debd30{0x00000000ff9a1acb, 0x535}, 1, 0) failed: Operation not permitted
/bin/sh: line 1: 89178 Aborted make -r PARALLELMFLAGS="" -C /var/tmp/portage/sys-libs/glibc-2.33-r1/work/glibc-2.33 objdir=`pwd` install
↑ この ↓ の部分が気になる
Read more...Posted:
| Categories:
cheatsheet
| Tags:
cheatsheet,
docker,
docker-compose
便利な
Docker Compose V2 では docker compose を使う。古い環境では docker-compose の場合があるが、新規手順では docker compose を優先する。
| オプション | 効果 |
|---|
| images | イメージ一覧 |
| logs | ログ |
| port web 3000 | ポート表示 |
| build | YAML に「build:」があれば、そのイメージをまとめてビルド |
| pull | YAML に「image:」があれば、そのイメージをまとめてプル |
| up -d | pull して build してからデーモンとして まとめて起動 |
| up -d hoge | hoge と依存するデーモン だけ を起動 |
| stop | まとめて終了 |
| rm | まとめて削除 |
キャッシュ使わないでビルド
docker compose build --no-cache
既存のコンテナを作り直す
docker compose up --force-recreate minecraft-touhou
参照
docker-compose コマンドまとめ - Qiita
docker-compose を使うと複数コンテナの管理が便利に - Qiita
Docker Compose - docker-compose.yml リファレンス - Qiita
Read more...Posted:
| Categories:
AWS
| Tags:
aws-cli,
docker,
ECR
dockerコンテナをECR repository( 以下、ECR )にアップする
まず、Web UIにログインした後、上部メニューの[ サービス ]->[ Elastic Container Registry ]->[ リポジトリ ]->[ リポジトリの作成 ] からリポジトリを作成する。
リポジトリ名
『リポジトリ名は英字で始まる必要があり、小文字、数字、ハイフン、アンダースコア、スラッシュのみを含めることができます。』というルールがある。
スラッシュがつけられるので、組織名をつけた。Githubのレポジトリ名は大文字を許容するが、ECRは許容しないので小文字に変更する。
example/Hoge_Web -> example/hoge_web
AWS CLIがインストールされていなければインストールして、アカウント設定する
ECRへのアクセス設定をする
( これはリポジトリ作成時に説明が表示されます。一度、空のリポジトリを作成すると流れがより良く分かるかもしれません )
ECRにログインする
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
上記コマンドはそのまま実行できる形なので、出力を別途実行する必要はありません。
Dockerイメージをビルドする
カレントディレクトリにあるDockerfileを用いてイメージ作成。Dockerfileにある場所に移動してから docker buildする。
docker build -t example/hoge_api .
イメージにタグを付ける
docker tag example/hoge_api:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/example/hoge_api:latest
Dockerレポジトリを作成
aws ecr create-repository --region us-east-1 --repository-name hoge
実行例。 これは2017/12に出たばかりの fargateモードで検証するため、バージニア北部リージョンにレポジトリを作成している
Read more...