Docker:挂载音量和运行节点应用程序

我第一次尝试使用docker作为开发目的。 我有一个节点应用程序。我想运行docker的应用程序。 这是我的dockerfile:

FROM node:6.0.0-slim MAINTAINER pyprism # Prepare app directory RUN mkdir -p /src/ # Install dependencies WORKDIR /src/ VOLUME .:/src/ RUN npm install # Build the app # RUN npm build # Expose the app port EXPOSE 8000 # Start the app CMD npm start 

和docker-compose文件:

 web: build: . ports: - '8000:8000' 

但是当我运行docker-compose up我得到了这个错误:

 Building web Step 1 : FROM node:6.0.0-slim ---> 7bf50b1ad9da Step 2 : MAINTAINER pyprism ---> Running in d1defd389fe6 ---> b684686c614d Removing intermediate container d1defd389fe6 Step 3 : RUN mkdir -p /src/ ---> Running in 36b64560f88f ---> 8eb6847d67e4 Removing intermediate container 36b64560f88f Step 4 : WORKDIR /src/ ---> Running in 00d4c1fd2cf5 ---> 88a54e6af176 Removing intermediate container 00d4c1fd2cf5 Step 5 : VOLUME .:/src/ ---> Running in dc0e9d9d973a ---> b558f03ce63c Removing intermediate container dc0e9d9d973a Step 6 : RUN npm install ---> Running in 09445786b71e npm info it worked if it ends with ok npm info using npm@3.8.6 npm info using node@v6.0.0 npm info lifecycle undefined~preinstall: undefined npm info linkStuff !invalid#1 npm info lifecycle undefined~install: undefined npm info lifecycle undefined~postinstall: undefined npm info lifecycle undefined~prepublish: undefined npm WARN enoent ENOENT: no such file or directory, open '/src/package.json' npm WARN src No description npm WARN src No repository field. npm WARN src No README data npm WARN src No license field. npm info ok ---> 8c544294e6c5 Removing intermediate container 09445786b71e Step 7 : EXPOSE 8000 ---> Running in 965e192bc67e ---> daaf52fac6ca Removing intermediate container 965e192bc67e Step 8 : CMD npm start ---> Running in 890549e3aea7 ---> 19a3dc786cee Removing intermediate container 890549e3aea7 Successfully built 19a3dc786cee WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating redux_web_1 Attaching to redux_web_1 web_1 | npm info it worked if it ends with ok web_1 | npm info using npm@3.8.6 web_1 | npm info using node@v6.0.0 web_1 | npm ERR! Linux 4.4.0-22-generic web_1 | npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "start" web_1 | npm ERR! node v6.0.0 web_1 | npm ERR! npm v3.8.6 web_1 | npm ERR! path /src/package.json web_1 | npm ERR! code ENOENT web_1 | npm ERR! errno -2 web_1 | npm ERR! syscall open web_1 | web_1 | npm ERR! enoent ENOENT: no such file or directory, open '/src/package.json' web_1 | npm ERR! enoent ENOENT: no such file or directory, open '/src/package.json' web_1 | npm ERR! enoent This is most likely not a problem with npm itself web_1 | npm ERR! enoent and is related to npm not being able to find a file. web_1 | npm ERR! enoent web_1 | web_1 | npm ERR! Please include the following file with any support request: web_1 | npm ERR! /src/npm-debug.log redux_web_1 exited with code 254 

这不是在dockerfile中使用VOLUME指令的正确方法。 正如文档所述:“VOLUME指令创build一个具有指定名称的挂载点,并将其标记为从本地主机或其他容器保存外部安装的卷”,我不认为是你想要做的。

您不需要指定VOLUME指令,也不需要创buildsrc directoy。 修改Dockerfile如下:

 FROM node:6.0.0-slim MAINTAINER pyprism # Install dependencies WORKDIR /src/ RUN npm install # Expose the app port EXPOSE 8000 # Start the app CMD npm start 

现在,您可以导航到Dockerfile目录并构build映像:

 $docker build -t node . 

然后使用-v选项运行容器来安装您的本地目录,如下所示:

  $docker run -p 8000:8000 -v path/to/code/dir:/src/ <image-name> 

这会将你的代码目录安装在/ src中。

如果您想使用docker compose,只需在docker-compose.yml文件中指定卷即可:

  web: build: . volumes: - path/to/code/dir:/src/ ports: - '8000:8000' 

您不能在dockerfile中执行此VOLUME。:/ VOLUME .:/src/ 。 在dockerfile中指定一个主机挂载点不合法,因为它会使其与主机相关。 将卷映射定义移到docker-compose.yml文件中。