Cannot create container for 〇〇: create .: volume name is too short, names should be at least two alphanumeric characters


エラー文

$ docker-compose up -d
中略
Cannot create container for service webserver: create .: volume name is too short, names should be at least two alphanumeric characters

.というパス名が短すぎるぞ、と怒られてます。

原因

docker-compose.yml

version: "3.7"
services:
  webserver:
    volumes:
      - ./bar/:/foo/bar/
      - ${HOGE_CFG}:/foo/hoge.ctg

docker-compose.ymlを確認しましたが、.だけをパス名に指定したvolumeは無さそうです。
そこでちょっと閃いて、6行目の$HOGE_CFGの中身を覗いてみることにしました。

$ echo $HOGE_CFG

シェル変数$HOGE_CFGの中身が空でした。
$HOGE_CFGに何も入ってなかったから、docker-compose.ymlの6行目が- .:/foo/hoge.ctgと同じ扱いになってしまったみたいです。

$HOGE_CFGの定義場所を探し、$HOGE_CFGが定義されていなかった問題を解消したら、この問題も解決しました。

余談

Ubuntu Desktopで『rm -rf /』を実行

例えば、a=/var/tmp/log2といったな変数を指定してrm -rf $a/のような処理をしていたとする。スクリプトの書き換えやロジックのミスなどで変数aが空だと、rm -rf /というコマンドが実行されてしまうことになる。rm -rf /*はrmコマンドからの警告なしにそのまま実行されてしまうため、ここに示したようにやっぱりシステムは壊れてしまう。

これと同種の問題だと思いました。
もし自分でスクリプトを書くときには、シェル変数でパスを指定するときは、シェル変数に何も入っていなかったときにどのパスになってしまうのか?は注意しなくてはいけないなと思いました。

参考記事

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