2014-09-17 14 views
5

Ich versuche, eine kleine Rails-App in einem Andock-Container auszuführen. Ich bin nah dran, aber ich kämpfe mit meiner Dockerfile.Hinzufügen eines Projektordners mit Ausnahme von Dockerfile

Ich habe den folgenden Befehl zu meiner Dockerfile hinzugefügt, um rekursiv alle Dateien in meinem Projektordner hinzuzufügen.

ADD . 

Danach laufe ich

RUN bundle install --deployment 

Da jedoch mein ADD Befehl auch die Dockerfile fügt hinzu, es bedeutet, dass mein Bild-Cache jedes Mal bricht ich meine Dockerfile bearbeiten zwingt mich zu rebundle.

Nach https://docs.docker.com/reference/builder/#the-dockerignore-file, kann ich eine .dockerignore Datei verwenden Dockerfile zu ignorieren, aber dies bewirkt, dass der docker build Befehl mit

2014/09/17 22:12:46 Dockerfile was excluded by .dockerignore pattern 'Dockerfile' 

zum Scheitern verurteilt Wie kann ich mein Projekt zu meinem Bild leicht hinzufügen, aber ausschließen Dockerfile, also breche ich den docker image cache nicht?

Antwort

1

Es ist ein Problem, für das auf Github: https://github.com/docker/docker/issues/7969

Ihr Hauptproblem die Räumung des Cache ist wegen der ADD und der Modifikation der Dockerfile. Einer der Betreuer erklärt, dass für den Moment, die .dockerignore Datei nicht damit umgehen soll:

It - .dockerignore - überspringt einige Dateien, wenn Sie Ihren Kontext von Client laden Daemon und Daemon benötigt Dockerfile für Bild aufbauen. Der Grundgedanke von dockerignore (vorerst) ist das Überspringen von großen Verzeichnissen für einen schnelleren Kontext-Upload, kein sauberer Kontext. full comment on Github

Ich fürchte, dass die Bild-Cache wird brechen, wenn Sie ADD Dockerfile während these lines werden nicht geändert.

Vielleicht ein Weg, mit dem Cache zu tun ist, um alle Dateien zu platzieren Sie in einem anderen Verzeichnis als die Dockerfile hinzufügen möchten:

. 
├── Dockerfile 
└── files_to_add/ 

Dann, wenn Sie ADD files_to_add, wird die Dockerfile nicht und die einbezogen werden Der Cache wird nicht entfernt.

Aber ich glaube nicht, dass dieser Trick eine Lösung ist. Ich möchte auch meine Dockerfile neben anderen Dateien im Stamm meiner Projekte haben.

+0

Das eigentliche Problem hier ist nicht das Vorhandensein der Datei, aber die Entwertung der Docker Bild-Cache verursacht Bündel installiert erneut auszuführen. Das versuche ich zu vermeiden, um die Dinge zu beschleunigen. –

+1

Ja, ich verstehe Ihren Standpunkt (ich habe das gleiche Problem in der Tat). Aber es scheint, dass es mit der '.dockerignore' Datei noch nicht möglich ist. Einer der Betreuer erklärt warum in der Ausgabe. Außerdem ist der Fehler, den Sie erhalten, [hier in der Codequelle] definiert (https://github.com/docker/docker/blob/e49c70109228d657790190007c8f9d7c55a25be2/api/client/commands.go#L136-L142). Im Moment fürchte ich, dass es nicht möglich ist. – Kuhess

+1

Ich habe gerade die Antwort geändert, um auf das Cache-Räumungsproblem konzentriert zu sein. – Kuhess

3

Ihre Erklärung in einem Kommentar zu der Antwort von @Kuhess, sagen, dass das eigentliche Problem ist "die Ungültigmachung des Docker-Image-Cache verursacht Bundle-Installation erneut ausgeführt werden", ist hilfreich, um Ihnen eine Antwort.

Ich habe eine Dockerfile verwendet, die wie folgt aussieht für meine Schienen 4.1. * App. Wenn Sie zunächst Gemfile * hinzufügen, dann die Bundle-Installation ausführen und erst dann den Rest der App HINZUFÜGEN, wird der Installationsschritt des Pakets zwischengespeichert, es sei denn, eine der Gemfile * -Dateien ändert sich.

FROM ruby:2.1.3 

RUN adduser --disabled-password --home=/rails --gecos "" rails 

RUN gem install bundler --no-ri --no-rdoc 
RUN gem install -f rake --no-ri --no-rdoc 

RUN mkdir /myapp 
WORKDIR /myapp 

ADD Gemfile /myapp/Gemfile 
ADD Gemfile.lock /myapp/Gemfile.lock 
RUN bundle install 

ADD . /myapp 

RUN chown -R rails:rails /myapp 

USER rails 
EXPOSE 3000 
ENV RAILS_ENV production 
CMD bundle exec rails server -p 3000 

Mein Dockerfile ist im Root-Verzeichnis der App, aber Änderungen daran (oder einem anderen Teil der App) nicht dazu führen, brechen die Bild-Cache für Bündel installieren, da sie hinzugefügt werden, nachdem es ausgeführt wird . Das einzige, was es kaputt macht, sind Änderungen an Gemfile *, was korrekt ist.

FYI, meine .dockerignore Datei sieht wie folgt aus:

.git 
log 
vendor/bundle 
+0

+1 für adduser Teil, so viele root-basierte dockerfiles herum – gertas

Verwandte Themen