Activate python virtualenv in Dockerfile

后端 未结 6 1817
忘了有多久
忘了有多久 2020-12-05 02:04

I have a Dockerfile where I try to activate python virtualenv after what, it should install all dependencies within this env. However, everything still gets installed global

相关标签:
6条回答
  • 2020-12-05 02:31

    Setting this variables

    ENV VIRTUAL_ENV /env
    ENV PATH /env/bin:$PATH
    

    is not exactly the same as just running

    RUN . env/bin/activate
    

    because activation inside single RUN will not affect any lines below that RUN in Dockerfile. But setting environment variables through ENV will activate your virtual environment for all RUN commands.

    Look at this example:

    RUN virtualenv env                       # setup env
    RUN which python                         # -> /usr/bin/python
    RUN . /env/bin/activate && which python  # -> /env/bin/python
    RUN which python                         # -> /usr/bin/python
    

    So if you really need to activate virtualenv for the whole Dockerfile you need to do something like this:

    RUN virtualenv env
    ENV VIRTUAL_ENV /env                     # activating environment
    ENV PATH /env/bin:$PATH                  # activating environment
    RUN which python                         # -> /env/bin/python
    
    0 讨论(0)
  • 2020-12-05 02:35

    Consider a migration to pipenv - a tool which will automate virtualenv and pip interactions for you. It's recommended by PyPA.

    Reproduce environment via pipenv in a docker image is very simple:

    FROM python:3.7
    
    RUN pip install pipenv
    
    COPY src/Pipfile* ./
    
    RUN pipenv install --deploy
    
    ...
    
    0 讨论(0)
  • 2020-12-05 02:36

    You don't need to use virtualenv inside a Docker Container.

    virtualenv is used for dependency isolation. You want to prevent any dependencies or packages installed from leaking between applications. Docker achieves the same thing, it isolates your dependencies within your container and prevent leaks between containers and between applications.

    Therefor, there is no point in using virtualenv inside a Docker Container unless you are running multiple apps in the same container, if that's the case I'd say that you're doing something wrong and the solution would be to architect your app in a better way and split them up in multiple containers.

    0 讨论(0)
  • 2020-12-05 02:39

    Although I agree with Marcus that this is not the way of doing with Docker, you can do what you want.

    Using the RUN command of Docker directly will not give you the answer as it will not execute your instructions from within the virtual environment. Instead squeeze the instructions executed in a single line using /bin/bash. The following Dockerfile worked for me:

    FROM python:2.7
    
    RUN virtualenv virtual
    RUN /bin/bash -c "source /virtual/bin/activate && pip install pyserial && deactivate"
    ...
    

    This should install the pyserial module only on the virtual environment.

    0 讨论(0)
  • 2020-12-05 02:46

    There are perfectly valid reasons for using a virtualenv within a container.

    You don't necessarily need to activate the virtualenv to install software or use it. Try invoking the executables directly from the virtualenv's bin directory instead:

    FROM python:2.7
    
    RUN virtualenv /ve
    RUN /ve/bin/pip install somepackage
    
    CMD ["/ve/bin/python", "yourcode.py"]
    

    You may also just set the PATH environment variable so that all further Python commands will use the binaries within the virtualenv as described in https://pythonspeed.com/articles/activate-virtualenv-dockerfile/

    FROM python:2.7
    
    RUN virtualenv /ve
    ENV PATH="/ve/bin:$PATH"
    RUN pip install somepackage
    
    CMD ["python", "yourcode.py"]
    
    0 讨论(0)
  • 2020-12-05 02:51

    If you your using python 3.x :

    RUN pip install virtualenv
    RUN virtualenv -p python3.5 virtual
    RUN /bin/bash -c "source /virtual/bin/activate"
    

    If you are using python 2.x :

    RUN pip install virtualenv
    RUN virtualenv virtual
    RUN /bin/bash -c "source /virtual/bin/activate"
    
    0 讨论(0)
提交回复
热议问题