问题描述
dockerfile没有改变,只是workdir所对应的容器外部的文件发生了改变请问这是必须的么,如果是这样的话,是要用docker compose-up 自动简化这个过程?
如果不是必须的话,因为我的dockerfile的问题么?dockerfile如下:
FROM ubuntuMAINTAINER Tarty.Phoenix <tartyphoenix@gmail.com>RUN apt-get updateRUN apt-get install -y -q python-all python-pip libffi-devRUN apt-get install -y -q python-dev build-essentialADD ./flask_pure/requirements.txt /tmp/requirements.txtRUN pip install -qr /tmp/requirements.txtADD ./flask_pure /opt/flask_pure/WORKDIR /opt/flask_pureEXPOSE 80CMD ['python', 'manage.py', 'runserver']
问题解答
回答1:首先 workdir 代表的目录是容器里面的目录,不是 host 的。
下面的内容变化需要重新 build image
dockerfile 本身变化
COPY / ADD 指令的 source 文件变化
docker-compose 支持运行的时候重新 build image 的
service: - build: <image_base_dir>回答2:
你的问题中,有一点需要和你解释。通过创建和编辑dockerfile文件后,build创建一个image(镜像),而后run一个image产生一个container(容器),那么image和container是一一对应的关系了。那么当你编辑dockerfile文件改变workdir后,再去创建的container当然就是默认进入了新的workdir。因此你的问题的标题所描述的应该不是一个问题,而是正确的逻辑描述。
回答3:你对docker的理解错了,你这么做只是把某个文件夹的内容打包进镜像。建议你了解一下docker中的VOLUME卷的概念,只有通过容器启动时指定-v参数或者在docker-compose.yml中指定VOLUME参数才能实现容器挂载本地目录。
那么如何区分是否需要容器挂载本地目录,我的理解是处于开发状态还是生产状态。如果处于开发状态,则代码需要频繁变动,那么每修改一次代码都需要重新打包进镜像是很难接受的。如果处于生产状态,想象一下Docker Hub上提供那么多的镜像吧,如果这些镜像都提供你一个安装环境和源代码,然后你需要手动指定VOLUME把源代码目录挂载进去,再然后启动容器就会进行编译安装,你会觉得这个的体验怎么样?