Docker中的应用程序不会更新

我想在Docker中运行一个简单的Flask应用程序。 但它似乎即使我更新我的app.py代码,并重新启动docker容器没有更新。

我在OS X上运行docker工人。这是简单的我想念或这是一个预期的行为?

这就是我的docerfile的样子:

FROM ubuntu:14.04.3 # install dependencies RUN apt-get update RUN apt-get install -y nginx RUN apt-get install -y supervisor RUN apt-get install -y python3-pip # update working directories ADD ./app /app ADD ./config /config ADD requirements.txt / # install dependencies RUN pip3 install -r requirements.txt # setup config RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf RUN rm /etc/nginx/sites-enabled/default RUN ln -s /config/nginx.conf /etc/nginx/sites-enabled/ RUN ln -s /config/supervisor.conf /etc/supervisor/conf.d/ EXPOSE 80 CMD ["supervisord", "-n"] 

Docker 镜像docker build -t app .后获得的镜像 )是一个“冻结”快照。 它不可编辑; 它是当时添加到图像中的任何快照。

现在,一旦你运行一个图像,内容被展开(想像它就像存档被解压缩),然后你在图像中定义的过程运行; 这是一个容器

运行容器可以通过docker ps ,并且图像(可以用来运行新容器的东西)由docker images

容器可以写入文件系统,但默认情况下,一旦容器停止,所有更改都将丢失。 这些更改不会存储回图像。

图像是不可变的,直到你重build它们,容器继续使用它们开始的图像。 因此,使用导入app.py的Dockerfile方法,您需要运行以下命令来更新该文件:

 docker build -t app . docker stop <container_id> docker rm <container_id> docker run -p 80:80 -d --name=my-app app 

您需要运行docker ps -a来获取当前的容器标识。 通过命名您的容器,您可以通过“my-app”或您select的任何其他名称来引用它。

请注意,这是执行更新的缓慢方法。 为了更有效的开发,使用一个卷(使用MacOS,它必须位于/ Users下):

 docker run -p 80:80 -v $(pwd)/app:/app -d --name=my-app app 

现在,无论何时你更新你的app文件夹,你都可以重新启动python,假设它没有自动重新加载:

 docker restart my-app