Die Verwendung der Anweisung RUN in einer Dockerdatei mit 'source' funktioniert nicht
Habe ich ein Dockerfile, bin ich der Zusammenstellung zu installieren Vanille-python-Umgebung (in der ich die Installation einer app, aber zu einem späteren Zeitpunkt).
FROM ubuntu:12.04
# required to build certain python libraries
RUN apt-get install python-dev -y
# install pip - canonical installation instructions from pip-installer.org
# http://www.pip-installer.org/en/latest/installing.html
ADD https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py /tmp/ez_setup.py
ADD https://raw.github.com/pypa/pip/master/contrib/get-pip.py /tmp/get-pip.py
RUN python /tmp/ez_setup.py
RUN python /tmp/get-pip.py
RUN pip install --upgrade pip
# install and configure virtualenv
RUN pip install virtualenv
RUN pip install virtualenvwrapper
ENV WORKON_HOME ~/.virtualenvs
RUN mkdir -p $WORKON_HOME
RUN source /usr/local/bin/virtualenvwrapper.sh
Build läuft ok bis auf die Letzte Zeile, wo bekomme ich die folgende exception:
[previous steps 1-9 removed for clarity]
...
Successfully installed virtualenvwrapper virtualenv-clone stevedore
Cleaning up...
---> 1fc253a8f860
Step 10 : ENV WORKON_HOME ~/.virtualenvs
---> Running in 8b0145d2c80d
---> 0f91a5d96013
Step 11 : RUN mkdir -p $WORKON_HOME
---> Running in 9d2552712ddf
---> 3a87364c7b45
Step 12 : RUN source /usr/local/bin/virtualenvwrapper.sh
---> Running in c13a187261ec
/bin/sh: 1: source: not found
Wenn ich ls
in diesem Verzeichnis (nur um zu testen, ob die vorherigen Schritte begangen wurden) ich kann sehen, dass die Dateien vorhanden sind wie erwartet:
$ docker run 3a87 ls /usr/local/bin
easy_install
easy_install-2.7
pip
pip-2.7
virtualenv
virtualenv-2.7
virtualenv-clone
virtualenvwrapper.sh
virtualenvwrapper_lazy.sh
Wenn ich es versuche läuft gerade die source
Befehl bekomme ich die gleiche 'nicht gefunden' - Fehler wie oben. Wenn ich AUSFÜHREN einer interaktiven shell-Sitzung jedoch, source funktioniert:
$ docker run 3a87 bash
source
bash: line 1: source: filename argument required
source: usage: source filename [arguments]
Kann ich das Skript von hier, und dann fröhlich Zugang workon
mkvirtualenv
etc.
Habe ich getan einige Graben, und zunächst sah es aus, als wenn das problem liegen könnte, dass der Unterschied zwischen bash als Ubuntu login-shellund dash als Ubuntu system-shelldash nicht die Unterstützung der source
Befehl.
Jedoch, die Antwort auf diese scheint zu sein, zu verwenden '.' statt source
aber dies nur bewirkt, dass die Docker-runtime zu sprengen, mit einem go-Panik Ausnahme.
Was ist der beste Weg, ein shell-Skript von einem Dockerfile FÜHREN Sie die Anweisung zu bekommen, um diese (Uhr läuft aus der Standard-Basis-image für Ubuntu 12.04 LTS).
InformationsquelleAutor der Frage Hugo Rodger-Brown | 2013-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
RUN /bin/bash -c "source /usr/local/bin/virtualenvwrapper.sh"
InformationsquelleAutor der Antwort chobo
Ursprüngliche Antwort
Diese Arbeit sollte für jeden Ubuntu-docker Basis image. Ich in der Regel fügen Sie diese Zeile für jede Dockerfile ich Schreibe.
Bearbeiten, die von einem betroffenen Zuschauer
Wenn Sie möchten, um den Effekt von "verwenden
bash
stattsh
während dieses gesamten Dockerfile", ohne verändern und möglicherweise schädlich* der OS im inneren des Behälters, kann man nur sagen Sie Ihre Absicht, Docker. Das geschieht etwa so:Mehr detail in dieser Antwort weiter unten. https://stackoverflow.com/a/45087082/117471
InformationsquelleAutor der Antwort Anubhav Sinha
Ich hatte das gleiche problem und in der Ausführung pip-Installation im virtualenv ich hatte, um diesen Befehl zu verwenden:
Ich hoffe, es hilft.
InformationsquelleAutor der Antwort Andrea Grandi
Einfachsten ist die Verwendung der Punkt-operator im Ort der Quelle, die die sh-entspricht der bash
source
Befehl:Statt:
Verwenden:
InformationsquelleAutor der Antwort mixja
Überprüfen Sie die SHELL-Befehl. Die Standard-shell unter Linux ist ["/bin/sh", "-c"]
Können Sie ändern der Standard-shell verwenden
SHELL
welche änderungen shell verwendet für nachfolgendeRUN
Anweisungen im DockerfileNun, die Standard-shell hat sich geändert und Sie müssen nicht explizit definieren, die in jedem RUN Anweisung
Zusätzlicher Hinweis: Sie könnten auch
--login
option starten einer login-shell. Dies bedeutet~/.bachrc
zum Beispiel würde gelesen werden, und Sie brauchen nicht zu Quelle es sich ausdrücklich vor, bevor Ihr den BefehlInformationsquelleAutor der Antwort Ahmad Abdelghany
Aufbauend auf den Antworten auf dieser Seite möchte ich hinzufügen, dass Sie müssen sich bewusst sein, dass jede AUSFÜHRUNG der Anweisung wird unabhängig von den anderen mit
/bin/sh -c
und daher keine Umwelt vars, die normalerweise aus einer login-Shell.Der beste Weg, den ich bis jetzt gefunden habe ist, um das Skript hinzuzufügen, um
/etc/bash.bashrc
und rufen Sie dann jedem Befehl als bash-login.Beispielsweise können Sie installieren und setup-virtualenvwrapper, erstellen Sie die virtuellen env, haben Sie es aktiviert, wenn Sie eine bash-login, und dann installieren Sie Ihre python-Module, die in diesem env:
Lesen Sie die Anleitung auf bash startup files hilft, zu verstehen, was gewonnen wird, wenn.
InformationsquelleAutor der Antwort TomDotTom
Wenn Sie das Andockfenster 1.12 oder neuer, verwenden Sie einfach
SHELL
!Kurze Antwort:
allgemein:
python vituralenv:
Lange Antwort:
vom https://docs.docker.com/engine/reference/builder/#/shell
InformationsquelleAutor der Antwort Mithril
Laut Docker Dokumentation
Sehen https://docs.docker.com/engine/reference/builder/#run
InformationsquelleAutor der Antwort Gianluca Casati
Laut https://docs.docker.com/engine/reference/builder/#run der Standard [Linux] shell für
RUN
ist/bin/sh -c
. Sie scheinen zu erwarten, dass bashisms, so dass Sie verwenden die "exec " form" desRUN
Angabe Ihrer shell.Sonst, mit der "shell-form" LAUFEN und die Angabe einer anderen shell-Ergebnisse in verschachtelten Schalen.
Wenn du mehr als 1 Befehl muss eine andere shell, die Sie Lesen sollten, https://docs.docker.com/engine/reference/builder/#shell und ändern Sie Ihre Standard-shell, indem Sie diesen, bevor Sie Ihre Befehle AUSFÜHREN:
Hinweis: ich habe absichtlich die Tatsache ignoriert, dass es sinnlos ist, Quelle eine Schrift als die einzige Befehl, der in einen LAUF.
InformationsquelleAutor der Antwort Bruno Bronosky
Hatte ich auch Probleme im Laufenden
source
in einem DockerfileLäuft es bestens für den Bau von CentOS 6.6 Docker-container, aber es gab Probleme in der Debian-Container
Dies ist, wie ich es angegangen ist, kann nicht werden, ein eleganter Weg, aber das ist was für mich gearbeitet
InformationsquelleAutor der Antwort vikas027
Möchten Sie vielleicht zu laufen
bash -v
um zu sehen, was bezogen werden.Ich würde Folgendes tun, anstatt zu spielen mit symlinks:
RUN echo "source /usr/local/bin/virtualenvwrapper.sh" >> /etc/bash.bashrc
InformationsquelleAutor der Antwort vimdude
Dies geschieht, weil
source
ist eine integrierte bash anstatt eine binäre irgendwo auf dem Dateisystem. Ist Ihre Absicht, für das Skript, das Sie suchen, zu ändern, den container hinterher?InformationsquelleAutor der Antwort Paul Morie
Wenn Sie nur versuchen zu verwenden, pip zu installieren, etwas, das in der virtualenv, können Sie den PFAD ändern, env Blick in die virtualenv in den Ordner bin ersten
ENV PATH="/path/to/venv/bin:${PATH}"
Dann alle
pip install
Befehle, die Folgen im Dockerfile finden /Pfad/zu/venv/bin/pip-ersten und nutzen, die Installation in das virtualenv und nicht die system-python.InformationsquelleAutor der Antwort shadfc
Landete ich setzen meinen env Zeug in
.profile
mutierteSHELL
etwas wieInformationsquelleAutor der Antwort mattexx