Ho un Dockerfile che sto mettendo insieme per installare un ambiente Python Vanilla (in cui installerò un'app, ma in un secondo momento).
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
La build funziona correttamente fino all'ultima riga, dove ottengo la seguente eccezione:
[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
Se mi trovo ls
in quella directory (solo per testare che sono stati commessi i passaggi precedenti) posso vedere che i file esistono come previsto:
$ 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
Se provo a eseguire il source
comando, visualizzo lo stesso errore "non trovato" di cui sopra. Se eseguo comunque una sessione di shell interattiva, l'origine funziona:
$ docker run 3a87 bash
source
bash: line 1: source: filename argument required
source: usage: source filename [arguments]
Posso eseguire lo script da qui, quindi accedere felicemente workon
, mkvirtualenv
ecc.
Ho fatto qualche ricerca, e inizialmente sembrava che il problema potesse risiedere nella differenza tra bash come shell di accesso Ubuntu e dash come shell di sistema Ubuntu , dash non supporta il source
comando.
Tuttavia, la risposta a questa sembra essere l'uso di "." invece di source
, ma questo fa semplicemente esplodere il runtime Docker con un'eccezione di panico.
Qual è il modo migliore per eseguire uno script di shell da un'istruzione RUN Dockerfile per aggirare questo problema (sto eseguendo l'immagine di base predefinita per Ubuntu 12.04 LTS).
CMD source activate django-py35