Tôi có một Dockerfile mà tôi sắp đặt để cài đặt môi trường python python (trong đó tôi sẽ cài đặt một ứng dụng, nhưng vào một ngày sau đó).
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
Bản dựng chạy ổn cho đến dòng cuối cùng, nơi tôi nhận được ngoại lệ sau:
[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
Nếu tôi ls
vào thư mục đó (chỉ để kiểm tra các bước trước đó đã được cam kết) tôi có thể thấy rằng các tệp tồn tại như mong đợi:
$ 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
Nếu tôi thử chạy source
lệnh tôi sẽ gặp lỗi 'không tìm thấy' như trên. Tuy nhiên, nếu tôi CHẠY một phiên shell tương tác, nguồn sẽ hoạt động:
$ docker run 3a87 bash
source
bash: line 1: source: filename argument required
source: usage: source filename [arguments]
Tôi có thể chạy tập lệnh từ đây, và sau đó vui vẻ truy cập workon
, mkvirtualenv
v.v.
Tôi đã thực hiện một số hoạt động đào và ban đầu có vẻ như vấn đề có thể nằm ở sự khác biệt giữa bash là shell đăng nhập Ubuntu và dash là shell hệ thống Ubuntu , dash không hỗ trợ source
lệnh.
Tuy nhiên, câu trả lời cho điều này dường như là sử dụng '.' thay vì source
, nhưng điều này chỉ khiến cho thời gian chạy Docker nổ tung với một ngoại lệ hoảng loạn.
Cách tốt nhất để chạy tập lệnh shell từ lệnh RUN của Dockerfile để khắc phục điều này (đang chạy hình ảnh cơ sở mặc định cho Ubuntu 12.04 LTS).
CMD source activate django-py35