Docker中的应用不会更新

Jon*_*han 1 python 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"]
Run Code Online (Sandbox Code Playgroud)

BMi*_*tch 5

Docker 映像(您将获得docker build -t app .)是一个“冻结的”快照。它不可编辑;它是您在该时间点添加到映像的任何内容的快照。

现在,运行图像后,内容将被扩展(就像解压缩存档一样),然后您在图像中定义的过程就会运行。这是一个容器

正在运行的容器可以显示为docker ps,图像(可以用来运行新容器的内容)可以显示为docker images

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

在重建图像之前,图像是不可变的,并且容器将继续使用其原始图像。因此,使用导入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
Run Code Online (Sandbox Code Playgroud)

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

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

docker run -p 80:80 -v $(pwd)/app:/app -d --name=my-app app
Run Code Online (Sandbox Code Playgroud)

现在,只要您更新应用文件夹,就可以重新启动python(假设其中不包含自动重新加载):

docker restart my-app
Run Code Online (Sandbox Code Playgroud)

  • @BMitch-我为您的出色回答添加了一些背景知识,希望这可以为OP清除一切。 (2认同)