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
の意味とその使用方法は?
コンテナ内でvirtualenvを使用する理由は完全に正当です。
ソフトウェアをインストールまたは使用するために、virtualenvをアクティブにする必要は必ずしもありません。代わりに、virtualenvのbin
ディレクトリから実行可能ファイルを直接呼び出してみてください。
FROM python:2.7
RUN virtualenv /ve
RUN /ve/bin/pip install somepackage
CMD ["/ve/bin/python", "yourcode.py"]
Dockerコンテナ内でvirtualenvを使用する必要はありません。
virtualenvは、依存関係の分離に使用されます。インストールされている依存関係またはパッケージがアプリケーション間でリークしないようにします。 Dockerは同じことを達成し、コンテナー内の依存関係を分離し、コンテナー間およびアプリケーション間のリークを防ぎます。
そのため、同じコンテナで複数のアプリを実行している場合を除き、Dockerコンテナ内でvirtualenvを使用しても意味がありません。より良い方法と複数のコンテナにそれらを分割します。
私はこれが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モジュールがインストールされます。
この変数を設定する
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
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"