我有一个Django-Angular Web项目(称为工作流程),我使用Jenkins CI构建。 Jenkins监视存储库,并在新提交时使用以下2个执行清理和重新构建的脚本重新构建项目的容器:
#!/bin/sh
docker rm -v $(docker ps -a -q -f status=exited) 2>/dev/null
docker rmi $(docker images -q -f 'dangling=true') 2>/dev/null
exit 0
重建脚本是:
!/bin/sh
DOCKER_COMPOSE=/usr/local/bin/docker-compose
[ -x $DOCKER_COMPOSE ] || (
echo "docker-compose not found, install it from https://docs.docker.com/compose/install/"
exit 1
)
$DOCKER_COMPOSE build --pull || exit 1
$DOCKER_COMPOSE up -d || exit 2
$DOCKER_COMPOSE ps
我在Dockerfile
指令中的Docker图像中构建了我的django网站的javascript前端,如下所示:
FROM debian:jessie
ADD . /srv/workflows
# Install dependencies
RUN apt-get update && apt-get install -y git \
curl \
uwsgi \
uwsgi-plugin-python \
python-django \
python-psycopg2 \
python-django-celery \
python-django-jsonfield
RUN easy_install pip
RUN pip install djangorestframework \
python-social-auth
RUN pip install git+https://github.com/st4lk/django-rest-social-auth.git
# Set up node.js and build frontend
RUN curl --silent --location https://deb.nodesource.com/setup_5.x | bash -
RUN apt-get install -y nodejs
RUN npm install -g webpack gulp-cli bower
WORKDIR /srv/workflows/workflows/frontend
RUN npm install
RUN bower install --allow-root
RUN mkdir -p ../static
RUN mkdir -p ../../static
RUN gulp dist
# Get everything ready and run
WORKDIR /srv/workflows
RUN python manage.py validate
RUN python manage.py collectstatic --clear --noinput
CMD /bin/bash -c "python manage.py makemigrations --noinput; python manage.py migrate --noinput; /usr/bin/uwsgi --emperor /etc/uwsgi/apps-enabled/bostongene.ini"
但由于某些原因,当docker-compose
重建此图像时,django collectatic命令(python manage.py collectstatic --clear --noinput
)的结果仍然包含第一个图像中包含的第一个古老版本的文件,当我第一个从中创建了容器。为什么呢?
docker-compose.yml
的相关部分:
workflows-django:
restart: always
build: ./workflows
links:
- "workflows-db: workflows-db"
- "workflows-rabbitmq: workflows-rabbitmq"
volumes:
- /srv/workflows/static/
volumes_from:
- workflows-db
ports:
- "8000:8000"
command: /bin/bash -c "python manage.py makemigrations --noinput; python manage.py migrate --noinput; /usr/bin/uwsgi --emperor /etc/uwsgi/apps-enabled/bostongene.ini"
答案 0 :(得分:1)
(正如我们在评论中讨论的那样)
使用卷Compose preserves volumes on container recreate时。
即使您重建图像,如果它定义了相同的卷,它将继续使用。一般情况下,我建议不要将源代码(或本例中的资产)放入卷中。卷用于运行时状态,但资源和源代码应随映像一起更改,而不是在运行之间保留。
如果要继续使用卷,可以运行docker-compose rm
删除旧容器,这将删除对卷的引用。