Docker 使用 GitBash / Cmder - 路径问题

Dev*_*vWL 3 powershell git-bash docker cmder windows-10

Docker 终端命令

\n尝试使用 docker 教程 [https://docs.docker.com/get-started/06_bind_mounts/][1]\n
docker run -dp 3000:3000 -w /app -v "$(pwd):/app" node:12-alpine sh -c "yarn install && yarn run dev"\n
Run Code Online (Sandbox Code Playgroud)\n

我对上面的代码行有疑问。我在 Cmder、GitBash 和 Windows 10 PowerShell 终端中运行此行。

\n

控制台 1 - Cmder - 错误:

\n
docker: Error response from daemon: create $(pwd): "$(pwd)" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.\nSee \'docker run --help\'.\n
Run Code Online (Sandbox Code Playgroud)\n

控制台 2 - GitBash - `错误`:

\n
docker: Error response from daemon: the working directory \'C:/Program Files/Git/app\' is invalid, it needs to be an absolute path.\nSee \'docker run --help\'.\n
Run Code Online (Sandbox Code Playgroud)\n

可能的原因:

\n

https://github.com/docker/cli/issues/2204

\n

如何阻止 MinGW 和 MSYS 修改命令行中给出的路径名

\n

控制台 3 - Windows PowerShell - `成功`:

\n
df1ad0a4f71016f7832b6d9d02f963f33cc2cc8d5740e1013561287d875fb5de\n
Run Code Online (Sandbox Code Playgroud)\n

$ 码头工人 PS

\n
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                    NAMES\ndf1ad0a4f710   node:12-alpine           "docker-entrypoint.s\xe2\x80\xa6"   3 minutes ago   Up 3 minutes   0.0.0.0:3000->3000/tcp   exciting_liskov\n37d12fa854d7   mysql:5.7                "docker-entrypoint.s\xe2\x80\xa6"   3 hours ago     Up 3 hours     3306/tcp, 33060/tcp      admiring_faraday\n23803e6325db   docker/getting-started   "/docker-entrypoint.\xe2\x80\xa6"   13 hours ago    Up 13 hours    0.0.0.0:80->80/tcp       boring_banach\n
Run Code Online (Sandbox Code Playgroud)\n

$ 码头工人日志

\n
$ docker\ndf1ad0a4f71016f7832b6d9d02f963f33cc2cc8d5740e1013561287d875fb5de\nyarn install v1.22.5\nwarning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.\n[1/4] Resolving packages...\nsuccess Already up-to-date.\nDone in 0.52s.\nyarn run v1.22.5\n$ nodemon src/index.js\n[nodemon] 1.19.4\n[nodemon] to restart at any time, enter `rs`\n[nodemon] watching dir(s): *.*\n[nodemon] watching extensions: js,mjs,json\n[nodemon] starting `node src/index.js`\nUsing sqlite database at /etc/todos/todo.db\nListening on port 3000\nPS C:\\WEB APPS\\app\\app>\n
Run Code Online (Sandbox Code Playgroud)\n

以前有人让它在 GitBash 或 Cmder 中工作吗?或者这是我的 Env 问题?猜测大多数人会在 Mack 操作系统或 Linux 发行版上运行它。也许 vegrant + docker 是正确的选择?你在 Windows 上的设置是什么?

\n

返回控制台 2 - GitBash - 尝试解决可能的路径问题:

\n

因此,针对上述问题,我修改了添加附加“/”的行(How to stop MinGW and MSYS from mangling path names Give at the command line

\n
docker run -dp 3000:3000 -w //app -v "$(pwd)/app" node:12-alpine sh -c "yarn install && yarn run dev"\ncfde24fc30e8a8d3e83cade4a00ee318e37ced1d90aa831f0d56b9dc7148be22\n
Run Code Online (Sandbox Code Playgroud)\n

现在 docker 容器已创建但未运行...请参阅以下问题

\n

$ 码头工人日志

\n
cfde24fc30e8a8d3e83cade4a00ee318e37ced1d90aa831f0d56b9dc7148be22\nyarn install v1.22.5\ninfo No lockfile found.\n[1/4] Resolving packages...\n[2/4] Fetching packages...\n[3/4] Linking dependencies...\n[4/4] Building fresh packages...\nsuccess Saved lockfile.\nDone in 0.04s.\nyarn run v1.22.5\nerror Couldn\'t find a package.json file in "/app"\ninfo Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们有......错误Couldn\'t find a package.json file in "/app"有人能解决 gitbash 中的问题吗?

\n

Dev*_*vWL 7

控制台 2 - GITBASH - 解决方案

根据如何阻止 MinGW 和 MSYS 从命令行给出的修改路径名,MSYS_NO_PATHCONV=1我们可以通过在实际命令之前运行来使其在 Git bash 上工作。这将禁用该命令的路径转换。还有一种方法可以全局关闭路径转换,但因为我不知道确切的后果,所以我选择在每个命令之前添加此位。

控制台 2 - GitBash - 确定

MSYS_NO_PATHCONV=1 docker run -dp 3000:3000 -w /app -v "$(pwd):/app" node:12-alpine sh -c "yarn install && yarn run dev"
717d12b9fe5211f0189ccbed0ba056ca242647812627682d0149ede29af472a4
Run Code Online (Sandbox Code Playgroud)

docker 日志 c4a0bcc82c1b

yarn install v1.22.5
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
[1/4] Resolving packages...
success Already up-to-date.
Done in 0.64s.
yarn run v1.22.5
$ nodemon src/index.js
[nodemon] 1.19.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000
Run Code Online (Sandbox Code Playgroud)

控制台 1 - CMDER - 未找到 /app - 容器已创建但未运行

为了让这个命令在 cmndr 终端中工作,我必须在 `$(pwd)` 之前添加 `/`,如下所示:
docker run -dp 3000:3000 -w /app -v /$(pwd):/app node:12-alpine sh -c "yarn install && yarn run dev"
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有完全奏效。这次运行没有报错,但是没有找到/app路径下的文件。DOcker 容器已创建,但未显示在下面docker ps

error Couldn't find a package.json file in "/app"
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Run Code Online (Sandbox Code Playgroud)