事象
コンテナに以下のようにファイルをマウントしようと起動するも
# docker run -it -v test.txt:/tmp/test.txt ubuntu /bin/sh
コンテナ内ではディレクトリができている。
# ls -l /tmp total 4 drwxr-xr-x 18 root root xx test.txt
環境情報
- Docker version 19.03.5
- Debian GNU/Linux 9
原因と対応策
ファイルをフルパスで指定していないため存在しないtest.txtがディレクトリとしてマウントされてしまっている。
よって例えばマウントしたいfileが以下パスの場合は
# file /root/test.txt /root/test.txt: ASCII text
以下のようにフルパスで指定する。
# docker run -it -v /root/test.txt:/tmp/test.txt ubuntu /bin/sh
そうすれば想定通りファイルとしてマウントされる。
# ls -l /tmp total 4 -rw-r--r-- 1 root root 5 xx test.txt
以下、補足です。
補足
この事象、Windows上でコンテナを起動する際に注意が必要です。
というのもコマンドプロンプトから以下のようにフルパスで指定した場合は正常に動きますが
> docker run -it -v C:\cygwin64\tmp\test.txt:/tmp/test.txt ubuntu /bin/sh
Cygwinのファイルパスである以下でフルパスに指定しても存在しないディレクトリとみなされコンテナ上ではディレクトリになってしまいます。
$ docker run -it -v /tmp/test.txt:/tmp/test.txt ubuntu /bin/sh
この動きの肝は「存在しないパスを指定するとディレクトリとしてマウントされる」動きによる点、覚えておくと役立ちます。