Tengo un Dockerfile que estoy armando para instalar un entorno de python vainilla (en el que instalaré una aplicación, pero en una fecha posterior).
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 compilación funciona bien hasta la última línea, donde obtengo la siguiente excepción:
[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
Si entro ls
en ese directorio (solo para probar que se confirmaron los pasos anteriores) puedo ver que los archivos existen como se esperaba:
$ 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
Si intento simplemente ejecutar el source
comando, obtengo el mismo error 'no encontrado' que el anterior. Sin embargo, si EJECUTO una sesión de shell interactiva, la fuente funciona:
$ docker run 3a87 bash
source
bash: line 1: source: filename argument required
source: usage: source filename [arguments]
Puedo ejecutar el script desde aquí, y luego acceder felizmente workon
, mkvirtualenv
etc.
He cavado un poco, e inicialmente parecía que el problema podría estar en la diferencia entre bash como el shell de inicio de sesión de Ubuntu y dash como el shell del sistema de Ubuntu , el dash no admite el source
comando.
Sin embargo, la respuesta a esto parece ser usar '.' en lugar de source
, pero esto solo hace que el tiempo de ejecución de Docker explote con una excepción de pánico.
¿Cuál es la mejor manera de ejecutar un script de shell desde una instrucción Dockerfile RUN para evitar esto (estoy ejecutando la imagen base predeterminada para Ubuntu 12.04 LTS)?
CMD source activate django-py35