docker

Volume相対パス指定でもdocker runがしたい!

More than 1 year has passed since last update.

結論

相対パスの先頭に$PWDを付けることで解決できます。

現象

docker runのVolumeを相対パス指定がしたい。
なぜなら、例えばGitHubのREADME.mdのUsageを書くときに、「このファイルのあるディレクトリ上で以下のコマンドを実行してね」という形で実行コマンドを書きたいからです。絶対パスで記述してしまうと、そのまま使えないのです。

ところが・・・

$ docker build -t original_ubuntu .  # dockerbuildファイルが現在いるディレクトリ内に存在しているものとする
$ docker run -it -v .:/temp original_ubuntu
docker: Error response from daemon: create .: volume name is too short, names should be at least two alphanumeric characters.
See 'docker run --help'.

ひえぇ〜😅
どうやら、-vのホスト側ディレクトリは絶対パスもしくは名前を指定するということで、相対パスの指定はできないようです。
(参考: http://docs.docker.jp/engine/reference/run.html#volume

解決法

(簡単)$PWDをつける

相対パスの冒頭に環境変数$PWDを付ければ解決できます。

$ docker run -it -v $PWD:/temp original_ubuntu

MacOSXやUbuntuなどでは、環境変数$PWDによって実行中のディレクトリの絶対パスを取得できるのを利用しています。
なお、万が一、環境変数$PWDが設定されていないOS上で実行する場合は、上述の$PWD$(pwd)に置き換えてください。

docker-composeを使う

docker-composevolumesを使えば解決できます。(これだけのために使うのは変ですが。。。)

具体的には、まずdocker-composeをインストールします。(詳細な説明は省略します。)

次に、dockerfileと同じディレクトリにdocker-compose.ymlを用意します。

docker-compose.yml
version: "3"

services:
  main:
    build:
      context: .
      dockerfile: dockerfile
    container_name: original_ubuntu
    volumes:
      - ./:/temp

最後に、以下のコマンドを実行すれば、起動します。

$ docker-compose run main

最後に

大きなプロジェクトでは環境変数などでパスの管理をする方が良いのでしょうが、
小さなプロジェクトやテスト的に色々試してみた結果を残したいときに是非お使いください。