我正在学习docker,我在nodejs应用程序上处理卷时遇到了一些麻烦。
实际上,每次重新启动容器时,我都会想要测试一个简单的应用程序。
这样,我有以下dockerfile:
FROM node:4-onbuild
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
CMD [ "npm", "test" ]
现在,我使用以下方法构建了图像:
docker build -t myapp .
我尝试使用以下脚本运行它:
docker run -v //c/Project/nodejs/my-app:/usr/src/app my-app
或
docker run -v /c/Project/nodejs/my-app:/usr/src/app my-app
甚至
docker run -v c:/Project/nodejs/my-app:/usr/src/app my-app
我有以下错误告诉我,我在/ usr / src / app中没有package.json文件(但它是我的卷所在的位置,它应该是正确的否?)
npm info it worked if it ends with ok
npm info using npm@2.15.9
npm info using node@v4.5.0
npm ERR! Linux 4.4.15-moby
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "test"
npm ERR! node v4.5.0
npm ERR! npm v2.15.9
npm ERR! path /usr/src/app/package.json
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall open
npm ERR! enoent ENOENT: no such file or directory, open '/usr/src/app/package.json'
npm ERR! enoent This is most likely not a problem with npm itself
npm ERR! enoent and is related to npm not being able to find a file.
npm ERR! enoent
npm ERR! Please include the following file with any support request:
npm ERR! /usr/src/app/npm-debug.log
注意:如果我使用COPY命令而不是卷,它可以很好地工作,我可以在docker容器内看到我的nodejs测试
NB2:我在Windows 10上,docker v1.12.0
答案 0 :(得分:7)
Docker for Windows在运行容器内部的VM中运行(它仍然需要Linux主机)。挂载主机卷时,该卷将安装在Linux主机上。从Linux VM挂载到父Windows操作系统的唯一目录是c:/ Users,它在VM中显示为/ c / Users(请参阅docker's volume tutorial)。将项目移动到Users下的目录并挂载。
空文件夹/丢失文件的原因是,当您将不存在的主机文件夹/文件装入容器时,这是默认设置。在您的情况下,VM中不存在/ c / Project。 COPY有效,因为在构建开始之前,构建会将当前文件夹(除了.dockerignore条目)发送到Docker引擎(在VM中运行)。这是通过API传输的,而不是进行卷安装。
答案 1 :(得分:4)
有时Docker for Windows无法访问文件系统上的文件。它会以静默方式失败,因此它将启动容器并运行您的命令,npm将找不到所需的文件。
您可以通过重新共享所需的驱动器来解决此问题。
完成后,您应该能够正常挂载卷。