J'ai un Dockerfile que je mets en place pour installer un environnement python vanille (dans lequel j'installerai une application, mais à une date ultérieure).
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 construction s'exécute correctement jusqu'à la dernière ligne, où j'obtiens l'exception suivante:
[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 je suis ls
dans ce répertoire (juste pour tester que les étapes précédentes ont été validées), je peux voir que les fichiers existent comme prévu:
$ 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 j'essaye d'exécuter la source
commande, j'obtiens la même erreur «introuvable» que ci-dessus. Cependant, si je lance une session shell interactive, la source fonctionne:
$ docker run 3a87 bash
source
bash: line 1: source: filename argument required
source: usage: source filename [arguments]
Je peux exécuter le script à partir d'ici, puis accéder avec bonheur workon
, mkvirtualenv
etc.
J'ai fait quelques recherches, et au début, il semblait que le problème pourrait résider dans la différence entre bash en tant que shell de connexion Ubuntu et dash en tant que shell système Ubuntu , dash ne prenant pas en charge la source
commande.
Cependant, la réponse à cela semble être d'utiliser "." au lieu de source
, mais cela provoque juste l'explosion du Docker avec une exception de panique.
Quelle est la meilleure façon d'exécuter un script shell à partir d'une instruction Dockerfile RUN pour contourner ce problème (je suis en train d'exécuter l'image de base par défaut pour Ubuntu 12.04 LTS).
CMD source activate django-py35