Dockerfile build image时生成的django静态文件在docker run的时候丢失


我希望build一个django image,在build的时候执行依赖库的安装,并调用django命令生成静态文件。
但是在docker run的时候发现build过程中生成的文件并没有找到。

Dockerfile:
FROM python:2.7

RUN mkdir -p /data/www/test-proj
VOLUME /data/www
ADD test-proj /data/www/test-proj

WORKDIR /data/www/test-proj
RUN pip install -r requirements/local.txt

WORKDIR /data/www/test-proj/src
RUN python manage.py collectstatic --noinput # 生成静态文件,将放在/data/www/test-proj/assets中

build命令:

docker build -t test/django:debug .

我build以上Dockerfile,成功生成image,并且在build日志中看到该命令被执行,文件确实成功生成。
Step 10 : RUN python manage.py collectstatic --noinput
---> Running in bcf0d3114336

669 static files copied to '/data/www/test-proj/assets'.
---> 55616dc9e853
Removing intermediate container bcf0d3114336
Successfully built 55616dc9e853


但是在我执行
docker run -it test/django:debug /bin/bash
进行查看的时候,发现/data/www/test-proj/assets文件并不存在。
请问我应该如何处理才能确保assets文件在run的时候能够找回?
已邀请:

tuxknight

赞同来自: lethe3000


实际上你的VOLUME 指令写错位置了,应该在对需要挂载的目录进行读写操作完成后再加VOLUME,
VOLUME的作用是把该目录作为挂载点,docker run的时候会把host的一个目录挂载到该目录,不管你用没用-v参数。
如果在VOLUME之前往这个目录加了内容,docker会把内容拷贝到host的目录里,在VOLUME之后的操作会被忽略掉的。

这里是官方文档中给出的说明。
http://docs.docker.com/reference/builder/#volume

The docker run command initializes the newly created volume with any data that exists at the specified location within the base image. For example, consider the following Dockerfile snippet:

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

This Dockerfile results in an image that causes docker run, to create a new mount point at /myvol and copy the greeting file into the newly created volume.

Note: If any build steps change the data within the volume after it has been declared, those changes will be discarded.

lincoln_alex - inner peace

赞同来自:


不要用 docker run -it test/django:debug /bin/bash 改为 docker run -d -P test/django:debug
然后执行 docker exec 容器名 ls /data/www/test-proj/assets 看输出是否有需要的文件.
谢谢

要回复问题请先登录注册