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

docker-compose build doesn't re-create some slices of my container, resulting in partially obsolete code

我有一个 Django-Angular 网络项目(称为工作流),它是我用 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 图像中构建 javascript 我的 django 站点的前端,如下所示:

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"

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

使用卷时 Compose preserves volumes on container recreate

即使你重建镜像,如果它定义了相同的卷,它也会继续被使用。一般来说,我建议不要将源代码(或本例中的资产)放入卷中。卷用于 运行 时间状态,但资产和源代码应随图像变化,而不是在 运行 秒之间保留。

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