

Dokerfileをビルドしてイメージ作成を行い、docker runを行っていますが、  
以下のエラーが解決できない状況です。

# エラーメッセージ

[code]

    docker: invalid reference format.
    See 'docker run --help'.
    
[/code]

調べてみたところ、-v以降のコピー元、コピー先のpathの表記方法に原因がある記事を見て  
以下のパターンで実行してみましたが、すべて上記のエラーメッセージが出てしまいます。  
解決方法をご存じの方、教えてください。

# 環境

  * Win10 Pro
  * Powershell
  * Docker version 20.10.17, build 100c701

# コマンド実行ディレクトリ

C:/PC-Work/dockerenv

# 実行コマンド

[code]

    docker container run -it --name sample-python -v ${PWD}/ex01:/tmp/mydir /sample/python:latest
    
[/code]

[code]

    docker container run -it --name sample-python -v C:\PC-Work\dockerenv\ex01:/tmp/mydir /sample/python:latest
    
[/code]

[code]

    docker container run -it --name sample-python -v" ${PWD}/ex01/:/tmp/mydir" /sample/python:latest
    
[/code]

[code]

    docker container run -it --name sample-python -v "C:\PC-Work\dockerenv\ex01:/tmp/mydir" /sample/python:latest
    
[/code]


CC BY-SA 4.0
2022-10-23T01:39:42.080
91751
2023-06-25T16:03:45.413
2022-10-23T03:38:13.113
4236
question
windows docker powershell
docker container runのinvalid reference formatについて


[Docker for Windows × volumeオプション ×
パスの指定について](https://www.kinakomotitti.net/entry/2019/07/25/133612)で検証されている内容によりますと`-v`に与える文字列は

  * `-v "C:\test":/test`
  * `-v "C:/test":/test`
  * `-v C:/test:/test`

いずれも成功するとのことです。（私は試していないのでこの結果が正しいのかはわかりません。）

* * *

しかし、これはコマンドプロンプト（`cmd.exe`）での検証結果であり、PowerShellでは別の挙動を示します。というのもシェルは一般に引数を解釈し変更を加えるからです。どのように解釈されるかを確認するために
`cmd /c echo` に続けてこれらを入力するとわかります。

### コマンドプロンプト（`cmd.exe`）

[code]

    C> cmd /c echo -v "C:\test":/test
    -v "C:\test":/test
    C> cmd /c echo -v "C:/test":/test
    -v "C:/test":/test
    C>cmd /c echo -v C:/test:/test
    -v C:/test:/test
    
[/code]

→ ここで試した範囲では入力した文字列はそのままプログラムに渡される。

### PowerShell

[code]

    PS> cmd /c echo -v "C:\test":/test
    -v C:\test :/test
    PS> cmd /c echo -v "C:/test":/test
    -v C:/test :/test
    PS> cmd /c echo -v C:/test:/test
    -v C:/test:/test
    
[/code]

→ `""`は削除され、しかも空白を挿入される。

PowerShellに解釈され書き換えられないためにはPowerShellの仕様に従ったエスケープが必要で、次のような入力になります。

[code]

    PS> cmd /c echo -v `"C:\test`":/test
    -v "C:\test":/test
    
[/code]

→ `"`をバッククオート ` でエスケープする。

[code]

    PS> cmd /c echo -v `"C:/test":/test`
    -v "C:/test":/test
    
[/code]

→ `"`を含む文字列をシングルクオート`'`で括る。

* * *

以上を踏まえるとPowerShell上で入力するには次のような例になりますでしょうか。

[code]

    docker container run -it --name sample-python -v `"C:\PC-Work\dockerenv\ex01`":/tmp/mydir /sample/python:latest
    
[/code]

→ `"`で括りつつ、 バッククオート ` でエスケープする。パス区切り文字は `/` `\` どちらでもよい。

[code]

    docker container run -it --name sample-python -v '"C:\PC-Work\dockerenv\ex01":/tmp/mydir' /sample/python:latest
    
[/code]

→ `"`で括りつつ、文字列を`'`でエスケープする。パス区切り文字は `/` `\` どちらでもよい。

[code]

    docker container run -it --name sample-python -v C:/PC-Work/dockerenv/ex01:/tmp/mydir /sample/python:latest
    
[/code]

→ パス区切り文字に `/` を使い、クオートしない。


CC BY-SA 4.0
2022-10-23T03:37:56.823
91755
2022-10-23T03:37:56.823
4236
91751
answer