docker-compose build不会重新创建我的容器的某些切片,导致部分过时的代码

时间:2016-04-18 17:25:01

标签: docker docker-compose

我有一个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"

1 个答案:

答案 0 :(得分:1)

(正如我们在评论中讨论的那样)

使用卷Compose preserves volumes on container recreate时。

即使您重建图像,如果它定义了相同的卷,它将继续使用。一般情况下,我建议不要将源代码(或本例中的资产)放入卷中。卷用于运行时状态,但资源和源代码应随映像一起更改,而不是在运行之间保留。

如果要继续使用卷,可以运行docker-compose rm删除旧容器,这将删除对卷的引用。