web-dev-qa-db-ja.com

Dockerfileでpython virtualenvをアクティブにします

Dockerfileがあり、そこでpython virtualenvをアクティブにしようとしています。このenv内のすべての依存関係をインストールする必要があります。ただし、すべてが引き続きグローバルにインストールされます。私はさまざまなアプローチを使用しましたが、どれも機能しませんでした。また、エラーも発生しません。問題はどこにありますか?

1. ENV PATH $PATH:env/bin

2. ENV PATH $PATH:env/bin/activate

3. RUN . env/bin/activate

Google Cloudのpython-runtimeイメージのDockerfile構成の例 も従いました。これは基本的に上記と同じものです。

これらの環境変数の設定は、source/env/bin/activateの実行と同じです。

ENV VIRTUAL_ENV /env

ENV PATH /env/bin:$PATH

さらに、ENV VIRTUAL_ENV /envの意味とその使用方法は?

26
igsm

コンテナ内でvirtualenvを使用する理由は完全に正当です。

ソフトウェアをインストールまたは使用するために、virtualenvをアクティブにする必要は必ずしもありません。代わりに、virtualenvのbinディレクトリから実行可能ファイルを直接呼び出してみてください。

FROM python:2.7

RUN virtualenv /ve
RUN /ve/bin/pip install somepackage

CMD ["/ve/bin/python", "yourcode.py"]
18
Ellis Percival

Dockerコンテナ内でvirtualenvを使用する必要はありません。

virtualenvは、依存関係の分離に使用されます。インストールされている依存関係またはパッケージがアプリケーション間でリークしないようにします。 Dockerは同じことを達成し、コンテナー内の依存関係を分離し、コンテナー間およびアプリケーション間のリークを防ぎます。

そのため、同じコンテナで複数のアプリを実行している場合を除き、Dockerコンテナ内でvirtualenvを使用しても意味がありません。より良い方法と複数のコンテナにそれらを分割します。

17
Marcus Lind

私はこれがDockerで行う方法ではないことをMarcusに同意しますが、あなたは望むことをすることができます。

DockerのRUNコマンドを直接使用しても、仮想環境内から命令を実行しないため、答えは得られません。代わりに、/ bin/bashを使用して1行で実行される命令を絞り込みます。次のDockerfileがうまくいきました。

FROM python:2.7

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

これにより、仮想環境にのみpyserialモジュールがインストールされます。

11
pinty

この変数を設定する

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

単に実行しているのとまったく同じではありません

RUN . env/bin/activate

単一のRUN内でアクティブ化しても、Dockerfile内のRUNの下の行には影響しません。ただし、ENVを使用して環境変数を設定すると、すべてのRUNコマンドに対して仮想環境がアクティブになります。

この例を見てください:

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

したがって、Dockerfile全体でvirtualenvを実際にアクティブにする必要がある場合は、次のようにする必要があります。

RUN virtualenv env
ENV VIRTUAL_ENV /env                     # activating environment
ENV PATH /env/bin:$PATH                  # activating environment
RUN which python                         # -> /env/bin/python
1
monitorius

python 3.xを使用している場合:

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

python 2.xを使用している場合:

RUN pip install virtualenv
RUN virtualenv virtual
RUN /bin/bash -c "source /virtual/bin/activate"
0
Chirag Maliwal