docker-compose cp がやりたい

複数のdockerコンテナを管理できる docker-compose コマンドですが、コンテナにファイルをコピーしようとdocker-compose cpをやろうとしてもそんなコマンドないよと言われてしまいます。 なのでその代わりに使える方法のメモ。

TL;DR

ホストからコンテナへコピー

docker cp {ホスト側のファイルパス} $(docker-compose ps -q {サービス名}):{docker内のパス}

コンテナからホストへコピー

docker cp $(docker-compose ps -q {サービス名}):{docker内のパス} {ホスト側のファイルパス} 

解説

docker cp

通常のdockerコマンドでファイルをコピーしようとするとこんな感じです。

docker cp {コピー元} {コピー先}

ホストからコンテナ

docker cp {ホスト側ファイルパス} {コンテナ名}:{docker内のパス}

コンテナからホスト

docker cp {コンテナ名}:{docker内のパス} {ホスト側ファイルパス}

docker-compose ps

docker-compose psコマンドは動いているサービス(コンテナ)の一覧を表示するコマンドです。 -p {サービス名} をつけることで、サービスのコンテナIDのみが表示されるようにしています。

version: '3'
services:
  mysql:              # <- ここの名前
    image: mysql
    build:
      context: ./
      dockerfile: ./docker/mysql/Dockerfile

上記のようなdocker-compose.ymlファイルがあった場合{サービス名}mysqlとなります。

docker-compose ps -p mysql

組み合わせる

上記の二つを組み合わせると冒頭のコマンドになります。

ホストからコンテナへコピー

docker cp hoge.txt $(docker-compose ps -q mysql):/var/hoge.txt

コンテナからホストへコピー

docker cp $(docker-compose ps -q mysql):/var/hoge.txt hoge.txt