Skaffoldはローカルで開発する際、ソースコードの変更を検出して、自動的にビルド、プッシュ、デプロイを行ってくれ大変便利です。
しかしソースコードに量が多くなってくるとビルドに時間がかかってきます。
そんなときは、SkaffoldのFile sync機能を使えばイメージのリビルド、リデプロイ、リスタートなしに、sync対象のファイルのなかで変更があったファイルのみをコンテナに直接反映できます。
syncには2種類のモードがあります。
inferモード
Dockerfileをもとにsync先を推定するモードです
例えば以下のようなDockerfileがあり、
FROM hugo
ADD .filebaserc /etc/
ADD assets assets/
COPY static-html static/
COPY content/en content/t
skaffold.yamlに以下のようなSync設定がされていた場合、
build:
artifacts:
- image: gcr.io/k8s-skaffold/node-example
context: node
sync:
infer:
- '.filebaserc'
- 'static-html/*.html'
- '**/*.png'
- 'content/en/**/*.md'
-
.filebaserc
は、コンテナの/etc/.filebaserc
にSyncされる -
static-html/a.html
は、コンテナのstatic/
以下にSyncされる(static-html/sub/a.html
はSync対象外) -
assest/img.png
はコンテナのassets/img.png
に、またstatic-html/imgs/demo.png
はコンテナのstatic/imgs/demo.png
にSyncされる -
content/en/sub/index.md
はコンテナのcontent/sub/index.md
にSyncされる(content/en_GB/index.md
はSync対象外)
注意点としては、inferモードはファイルが変更,追加された場合のみコンテナに反映されます。ファイルの削除は常にリビルドが発生します。
manual モード
Sync元とSync先を自分で指定するモードです。
build:
artifacts:
- image: gcr.io/k8s-skaffold/node-example
context: node
sync:
manual:
# .filebasercファイルを/etcディレクトリにsyncする
- src: '.filebaserc'
dest: /etc
# static-htmlディレクトリ以下のhtmlファイルをstaticディレクトリ以下にsyncする
- src: 'static-html/*.html'
dest: static
# すべてのpngファイルをassetsディレクトリにsyncする
# 例えばimg.pngは assets/img.pngに、sub/img.pngはassets/sub/img.pngにsyncされる
- src: '**/*.png'
dest: assets
# content/en以下のmdファイルをcontentディレクトリへsyncする
# strip指定がされているので、content/en/hoge/fuga.mdのファイルは content/hoge/fuga.mdにsyncされる
- src: 'content/en/**/*.md'
dest: content
strip: 'content/en/'
もしすべてのファイルをsync対象にしたい場合は以下のようにすればOKです。(DockerfileやKubernetesマニフェストファイル、skaffold.yaml等を変更してもリビルド、リデプロイ、リスタートが実行されないので注意)
sync:
manual:
- src: '**/*'
dest: '.'
まとめ
File sync機能、大変便利ですね。
この機能によって、ホストマシンのボリュームをマウントしながらDockerを動かして開発するときの開発体験とそれほど変わらず、Kubernetesを利用して開発ができるのではないかと思います。
なおFile sync機能は2019/12/13現在、β機能です。
File syncの制限事項
- File syncはコンテナのユーザによって変更可能なファイルのみ更新可能です(うまくsyncされなかったらUser、権限を確認しましょう)
- File sync機能を使うにはコンテナ内でtarコマンドが使える必要があります
- ローカルソースファイルしかsyncされません。builderによって生成されたファイルはsyncされません。
- manualモードとinferモードを同時に使うことはできません。