リモートで動くDockerにファイルを送ったり持ってきたりする方法

こんにちは、本日からCX事業部(Customer eXperience)所属になった夏目です。

サーバーレスのCI/CDでDockerを使っているのですが、そこで少し問題になったことを書いていきます。

問題

CircleCIやCodeBuildではDockerコマンドが使えます。
なので既存のDockerイメージを使用してテストやビルドをすることも珍しくもないと思います。

しかし、Dockerそのものはコマンドを実行しているローカルではなく、リモート上にあることが多いです。

そのため、-vオプションを使ってファイルを共有したりすることができません。

解決方法

ローカルのファイルをリモートのコンテナで使う方法

ローカルのファイルを追加するDockerImageを作成し、それをリモート上のDockerで動かすことで、ローカルのファイルをリモート上のDockerコンテナで使用することができます。

具体的にはDockerfileに以下の内容を記載します。

  1. FROMに使いたいDockerImageを指定する
  2. COPYでローカルのファイルをImageに含めるようにする

これだけです。

docker buildをする際、ローカルのファイルはリモートのDockerに一時的に送信されるので、ビルドしたDockerImageにローカルのファイルを含めることが可能です。

ビルドによってローカルのファイルを持ったDockerImageを作成し、そのDockerImageをリモートのDockerで使用することで、リモートのDockerコンテナにローカルのファイルを持っていったように見せかけています。

リモートのコンテナからファイルをローカルに持ってくる場合

docker cp ${コンテナ名}:${コンテナ内のファイルのフルパス} ${ローカルのパス} でファイルをローカルに持ってくることができる。

コンテナ内のファイルのフルパスをディレクトリのフルパスにした場合、そのディレクトリごとコピーすることもできます。

まとめ

リモートで動くDockerとファイルの授受ができるとCI/CDがより便利になります。

テストやデプロイで必要になったら使ってみてください。