Docker卷不会持续更改

认为这是一个两部分的错误,但这里的背后故事是我正在尝试学习Docker。 我想学习它,以便在Google云端平台上进行一些testing,并使用Docker文件创build了映像,但遇到文件问题在我的机器上或在容器内持续更改。

Dockerfile(如果需要的话)

FROM ubuntu:latest # Use Ubuntu as the base RUN apt-get -y update && apt-get -y upgrade && apt-get -y install curl git # update & updgrade all the apps. Also install cURL and Git (needed for node, apparently?) RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - # download the node 8.x setup (don't know the words on that one) file RUN apt-get install -y nodejs # Install NodeJS RUN mkdir /var/www/ && mkdir /var/www/app/ # create the directory /var/www/ and then, inside of that directory, create the var/www/app/ WORKDIR /var/www/app/ # our work directory is the app directory VOLUME /var/www/app ADD . . # add everything in the current directory on our file system to the work directory in our container RUN npm install # node apps need to have their dependencies installed CMD ["npm", "start"] #The command used when the docker container is run. 

请注意,我知道有几个NodeJS图像已经存在 – 这是一个学习练习,所以我从头开始。 在未来的可能性,我将与预build的docker图像之一。

通过build筑我没有收到任何错误。 我收到一个警告,但这是我在每个容器上看到的,因为我正在模拟一台Linux机器的Windows机器上工作。

现在,在我的工作中,我们有一些Dockerfile容器供我参考,我查阅的其中一个东西是我在编辑器中修改的文件是如何保存到复制到容器中的文件中的。 这似乎是通过docker-compose.yml文件中的volume选项。 所以,我试图自己创造一个。 请注意,我已经评论了dockerfile对我的理解。 如果我错了,或注意完全正确,请纠正我,因为我想以正确的方式学习。

泊坞窗,compose.yml

 version: "3" #what docker-compose version are we using? 3. services: #describes the services to be build when this is composed up web: # we will have a web service -- in the future I will obviously need to have some form of database build: ./ #where do we build this image from? the Dockerfile in this directory image: dockertest_node #what image will be named "dockertest_node" on my machine container_name: node_test #this container (once build), however, will be titled "node_test" to make it easier to work with and run docker exec commands volumes: - ./:/var/www/app #volumes, as I understand them, are a map from acutal file system -> containerized file system ports: - "8080:8080" # we expose port 8080 from my local machine to port 8080 on the container's machine. 

以下是这个项目中的两个文件,截至目前。 这些都是简单的事情,只是为了开始我。

index.js

 const express = require('express'); const app = express(); app.get('/', (req,res)=>{ res.send('hello world, from express!'); }); app.listen(8080, (err)=>{ if(err) { console.error(err); return 1; } console.log('server started'); }); 

的package.json

 { "name": "docker-test", "version": "0.0.0", "description": "Testing", "dependencies": { "express": "^4.0.0", "bootstrap":"4.0.0-beta", "jquery": "^3.0.0", "popper.js":"^1.11.0" }, "main": "index.js", "scripts": { "start": "node index.js" }, "author": "", "license": "ISC" } 

什锦其他信息

Docker版本(从docker -v检索)

Docker版本17.09.1-ce,build 19e2cf6

我在Windows 10 Pro上使用Docker for Windows

现在,如果我尝试运行docker-compose up我得到以下错误

 Starting node_test ... Starting node_test ... done Attaching to node_test node_test | node_test | > docker-test@0.0.0 start /var/www/app node_test | > node index.js node_test | node_test | module.js:538 node_test | throw err; node_test | ^ node_test | node_test | Error: Cannot find module 'express' node_test | at Function.Module._resolveFilename (module.js:536:15) node_test | at Function.Module._load (module.js:466:25) node_test | at Module.require (module.js:579:17) node_test | at require (internal/module.js:11:18) node_test | at Object.<anonymous> (/var/www/app/index.js:1:79) node_test | at Module._compile (module.js:635:30) node_test | at Object.Module._extensions..js (module.js:646:10) node_test | at Module.load (module.js:554:32) node_test | at tryModuleLoad (module.js:497:12) node_test | at Function.Module._load (module.js:489:3) node_test | npm ERR! code ELIFECYCLE node_test | npm ERR! errno 1 node_test | npm ERR! docker-test@0.0.0 start: `node index.js` node_test | npm ERR! Exit status 1 node_test | npm ERR! node_test | npm ERR! Failed at the docker-test@0.0.0 start script. node_test | npm ERR! This is probably not a problem with npm. There is likely additional logging output above. node_test | npm WARN Local package.json exists, but node_modules missing, did you mean to install? node_test | node_test | npm ERR! A complete log of this run can be found in: node_test | npm ERR! /root/.npm/_logs/2017-12-25T22_47_55_509Z-debug.log node_test exited with code 1 

在我添加.yml文件和Dockerfile本身的卷相关信息之前没有显示出来。 但是,我可以使用命令docker exec -p 8080:8080 -it dockertest_node bashlogin到容器,在那里我可以手动运行npm start而不会出现问题。

但是,如果当我在容器中,我确实touch something.txt文件只在容器内创build; 反之亦然,我对index.js或package.json文件的任何更改都不会将其放入容器中。

感谢您指出我可能犯的错误; 我真的想学习如何使用Docker。

如上所述,确保您在docker-compose中安装的卷不完全覆盖您放入映像中的内容(使用您的Dockerfile ADD .指令)

另外检查一下类似的练习aherve / simple-dockerized-dev-env issue 2

这是因为hello服务正在丢失node_modules文件夹。 它需要被添加到docker-compose.yml文件中

 volumes: - .:/var/www/app - /app/node_modules 

您遇到此错误,因为主机和容器之间的第二个卷映射确实会覆盖现有数据。 有关起始docker集装箱的更多信息可以在这个wiki上find 。 由于您在Dockerfile上运行npm install,因此您必须确保mount /node_modules作为mount /node_modules -compose中的数据卷装入。

所以为了克服这个问题,你需要:

 VOLUME /var/www/app ADD . /var/www/app RUN npm install 

然后在docker撰写yaml文件中包含这个:

 … volumes: - ./: /var/www/app - /var/www/app/node_modules