2016-04-18 1 views
0

Ich habe ein Django-Angular-Webprojekt (Workflows genannt), das ich mit Jenkins CI erstelle. Jenkins das Repository überwacht und auf neue begehen Wieder baut Container mein Projekt mit den folgenden zwei Skripte, die Bereinigung und Wieder build ausführen:docker-compose build erstellt einige Schichten meines Containers nicht neu, was zu teilweise veraltetem Code führt

#!/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 

Und die Wieder Build-Skript ist:

!/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 

I JavaScript-Frontend meiner django Website direkt in dem innerhalb Dockerfile Anweisung wie folgt Docker Bild bauen:

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" 

Aber aus irgendeinem Grunde, wenn docker-compose baut dieses Bild wieder auf, die Ergebnisse von django collectatic command (python manage.py collectstatic --clear --noinput) enthalten immer noch die allererste alte Version von Dateien, die im allerersten Bild enthalten waren, als ich den Container zum ersten Mal daraus erstellte. Warum?

Verwandte Abschnitt 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

Verwenden Sie ein Volume in der Compose-Datei? – dnephin

+0

@dnephin Ja, das tue ich. Den zugehörigen Abschnitt der 'docker-compose.yml'-Konfiguration zur Frage hinzugefügt. Also, ich denke, die Lautstärke bleibt zwischen den Builds erhalten und ich hätte sie mit etwas wie '--rm' oder' docker-cleanup-volumes.sh' löschen sollen? –

+0

Was genau ist Ihr Docker-Befehl? –

Antwort

1

(wie wir in den Kommentaren diskutiert)

Wenn ein Volumen Compose preserves volumes on container recreate verwenden.

Auch wenn Sie das Image neu erstellen, wird es weiterhin verwendet, wenn es dasselbe Volume definiert. Generell würde ich empfehlen, Quellcode (oder in diesem Fall Assets) nicht in Volumes zu schreiben. Volumes sind für den Runtime-Status, aber die Assets und der Quellcode sollten sich mit dem Image ändern und zwischen den Runs nicht erhalten bleiben.

Wenn Sie weiterhin Volumes verwenden möchten, können Sie docker-compose rm ausführen, um den alten Container zu entfernen, der den Verweis auf das Volume entfernt.

+0

Ich werde versuchen, Volumes mit 'docker-compose down -v' zu entfernen, hoffentlich werden Datenvolumes entfernt, ohne die zugehörigen Container zu entfernen. Danke für deine Hilfe, Dnephin! –