Ich habe eine Docker-Datei, die ich zusammenstelle, um eine Vanille-Python-Umgebung zu installieren (in die ich eine App installieren werde, 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
Der Build läuft bis zur letzten Zeile in Ordnung, wo ich die folgende Ausnahme bekomme:
[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 lsin dieses Verzeichnis gehe (nur um zu testen, ob die vorherigen Schritte festgeschrieben wurden), kann ich sehen, dass die Dateien wie erwartet vorhanden sind:
$ 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 versuche, nur den sourceBefehl auszuführen, wird der gleiche Fehler wie oben angezeigt. Wenn ich jedoch eine interaktive Shell-Sitzung starte, funktioniert die Quelle:
$ docker run 3a87 bash
source
bash: line 1: source: filename argument required
source: usage: source filename [arguments]
Ich kann das Skript von hier laufen, und dann glücklich Zugang workon, mkvirtualenvusw.
Ich habe ein bisschen gegraben, und anfangs sah es so aus, als ob das Problem im Unterschied zwischen bash als Ubuntu- Login-Shell und dash als Ubuntu- System-Shell liegen könnte . Dash den sourceBefehl nicht unterstützt .
Die Antwort darauf scheint jedoch zu sein '.' statt source, aber dies führt nur dazu, dass die Docker-Laufzeit mit einer Go-Panic-Ausnahme explodiert.
Was ist der beste Weg, um ein Shell-Skript über eine Dockerfile-RUN-Anweisung auszuführen, um dies zu umgehen (ich verwende das Standard-Basis-Image für Ubuntu 12.04 LTS).
CMD source activate django-py35