У мене є Dockerfile, який я збираю, щоб встановити середовище ванільного пітона (в яке я буду встановлювати додаток, але пізніше).
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
Збірка працює нормально до останнього рядка, де я отримую такий виняток:
[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
Якщо я lsперейду до цього каталогу (просто щоб перевірити, чи були виконані попередні кроки), я можу побачити, що файли існують як очікувалося:
$ 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
Якщо я спробую просто виконати sourceкоманду, я отримаю таку ж помилку "не знайдено", як вище. Якщо я запускаю інтерактивний сеанс оболонки, джерело працює:
$ docker run 3a87 bash
source
bash: line 1: source: filename argument required
source: usage: source filename [arguments]
Я можу запустити скрипт тут, а потім благополучно доступ workon, і mkvirtualenvт.д.
Я провів кілька копань, і спочатку здавалося, що проблема може полягати в різниці між bash як оболонкою для входу в Ubuntu , і тире як оболонка системи Ubuntu , тире не підтримує sourceкоманду.
Однак відповідь на це, мабуть, використовується "." замість цього source, але це просто призводить до того, що час роботи Docker вибухне за винятком паніки.
Який найкращий спосіб запустити скрипт оболонки з інструкції Dockerfile RUN, щоб обійти це (я запускаю базове зображення за замовчуванням для Ubuntu 12.04 LTS).
CMD source activate django-py35