我正在尝试在 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 images(在 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
您需要运行 docker ps -a 来获取您当前的容器 ID。通过命名您的容器,您可以通过“my-app”或您以后选择的任何其他名称来引用它。
请注意,这是进行更新的缓慢方式。为了更高效的开发,使用卷(对于 MacOS,这必须位于/Users 下):
docker run -p 80:80 -v $(pwd)/app:/app -d --name=my-app app
现在,只要你更新你的应用程序文件夹,你就可以重新启动 python,假设它没有自动重新加载:
docker restart my-app
