Search code examples
pythondockerboot2docker

Docker: "Unknown instruction: VIRTUALENV'


Dockerfile:

FROM ubuntu:14.04.2

RUN apt-get -y update && apt-get upgrade -y
RUN apt-get install python build-essential python-dev python-pip python-setuptools -y
RUN apt-get install libxml2-dev libxslt1-dev python-dev -y
RUN apt-get install libpq-dev postgresql-common postgresql-client -y
RUN apt-get install openssl openssl-blacklist openssl-blacklist-extra -y
RUN apt-get install nginx -y
RUN pip install virtualenv uwsgi

ADD canonicaliser_api ~
virtualenv ~/canonicaliser_api/venv
source ~/canonicaliser_api/venv/bin/activate
pip install -r ~/canonicaliser_api/requirements.txt

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80

CMD service nginx start

Build error:

...
Successfully installed virtualenv uwsgi
Cleaning up...
 ---> 0c141e23f725
Removing intermediate container d9fd3c20365d
Step 8 : ADD canonicaliser_api ~
 ---> 89b4fb40dba5
Removing intermediate container b0c1ad946fc4
Step 9 : VIRTUALENV 
Unknown instruction: VIRTUALENV

is it supposed to remove those containers? Why isn't it seeing virtualenv?


Solution

  • is it supposed to remove those containers?

    Yes. If you want to keep them for some reason, pass --rm=false to the docker build command.

    Why isn't it seeing virtualenv?

    It is seeing it, but because it's at the start of a line, it treats it like a Dockerfile instruction, but there is no "VIRTUALENV" instruction. Presumably, you meant to put RUN before each line after the ADD:

    ADD canonicaliser_api ~
    RUN virtualenv ~/canonicaliser_api/venv
    
    # This one needs to be a single RUN so the "source" will affect pip.
    RUN source ~/canonicaliser_api/venv/bin/activate && \
            pip install -r ~/canonicaliser_api/requirements.txt