LoginSignup
7
7

More than 3 years have passed since last update.

SkaffoldのFile sync機能を使えばイメージのビルドなしにコンテナに反映できて捗る

Last updated at Posted at 2019-06-07

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'
  1. .filebasercは、コンテナの/etc/.filebasercにSyncされる
  2. static-html/a.htmlは、コンテナのstatic/以下にSyncされる(static-html/sub/a.htmlはSync対象外)
  3. assest/img.pngはコンテナのassets/img.pngに、またstatic-html/imgs/demo.pngはコンテナのstatic/imgs/demo.pngにSyncされる
  4. 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モードを同時に使うことはできません。
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7