2017-05-27 4 views
1

Ich betreibe versucht, eine einfache Dockerfile schaffen, die MongoDB (mit dem Standard Docker Tutorial) und führt dann ein Python-Befehl installiert:Dockerized Mongo dauert ewig dann zu laden, nicht Mongo

FROM ubuntu:latest 

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 
RUN echo "deb http://repo.mongodb.org/apt/ubuntu $(cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2)/mongodb-org/3.2 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.2.list 

RUN apt-get update && apt-get install -y mongodb-org python python-pip 

RUN mkdir -p /data/db 

COPY ./requirements.txt /tmp/requirements.txt 
RUN pip install -r /tmp/requirements.txt 

WORKDIR /app 
COPY . /app 

EXPOSE 27017 

ENTRYPOINT ["/usr/bin/mongod"] 

CMD python -c "print 'hello world'" 

Dann lief ich docker build .

Leider war es ein völliger Fehler.

1) Jedes Mal, wenn ich docker build . nach einer Änderung ausführen, dauert es AGES zu bauen und gibt wahnsinnige Mengen an Protokollierung, langsam neu herunterladen und langsam jedes Paket neu installieren - total quälend.

2) docker ps zeigt keine Mongo

3) Der python -c "print 'hello world' Befehl am Ende läuft sagt, es läuft aber führt die eigentliche Zeichenfolge nicht ausgegeben.

Warum ist das so kompliziert?

Meine Ausgabe: https://pastebin.com/igyYY8v1 (Warnung, lang)

Antwort

0

Der Docker-Weg, um dies zu tun, ist in zwei Behälter zu teilen, 1 für die App und 1 für Mongo.

Versuchen Sie, Container als isolierte Prozesse anstelle von kleinen virtuellen Maschinen zu denken. Und denken Sie, dass es eine Menge Software als Docker-Images gibt, die bereit sind zu laufen, wie Mongo und Python wie folgt. Sie werden feststellen, dass ich nicht apt-installiert habe nichts allein.

Versuchen Sie dies mit docker-compose:

Dockerfile

FROM python 

COPY ./requirements.txt /tmp/requirements.txt 
RUN pip install -r /tmp/requirements.txt 

WORKDIR /app 
COPY app.py /app 

EXPOSE 27017 

CMD python app.py 

Docker-compose.yml

version: "3" 

services: 
    app: 
    build: . 
    links: 
     - mongo 
    mongo: 
    image: mongo:3.2 

App.py

print("hello world") 
print("bye") 

es auszuführen:

docker-compose up --build 

mit Lauf Docker-komponieren wie so können Sie von Ihrem Python-Anwendung, da dies Mongo Punkt: mongo:27017


PS: Bezüglich Ihrer Zeitüberschreitung müssen Sie verstehen, wie ENTRYPOINT und CMD funktionieren:

ENTRYPOINT ["/usr/bin/mongod"] 

CMD python -c "print 'hello world'" 

Das Docker erzählt diese einzigen Befehl auszuführen Containers zu starten:

`/usr/bin/mongod python -c "print 'hello world'"`. 

Wie Sie sehen, es macht keinen Sinn. ENTRYPOINT und CMD sind eine Art Verkettung.

0

Wenn Sie ändern, was in Ihrer Dockerfile getan wird, können die zuvor zwischengespeicherten Ebenen für die Erstellung nicht mehr verwendet werden. Wenn Sie also einen Schritt RUN ändern, müssen alle späteren Schritte RUN bei der Neuerstellung wiederholt werden.

Zusätzlich wird, wenn ein ENTRYPOINT und eine CMD verwendet werden, die CMD Saite (n) wird an die ENTRYPOINT angehängt werden, die Erzeugung der Befehlsfolge des Containers.

/usr/bin/mongod python -c "print 'hello world'

statt Aufspaltung in einzelne Befehle:

Also im Grunde wird die Konfiguration so etwas wie auszuführen versuchen.

Sie möchten das wirklich in zwei verschiedene Container aufteilen, von denen der eine Ihre Python-Anwendung und der andere Ihre Datenbank enthält. Dann können Sie ein Netzwerk erstellen, über das sie kommunizieren können.