4

docker build を使用して、flask ベースの Web アプリケーションのイメージを構築しようとしています。私の Dockerfile は次のようになります。

FROM beehive-webstack:latest
MAINTAINER Anuvrat Parashar <anuvrat@zopper.com>

EXPOSE 5000
ADD . /srv/beehive/

RUN pip install -i http://localhost:4040/root/pypi/+simple/ -r /srv/beehive/requirements.txt

-i フラグなしの pip install は機能しますが、当然遅い pypi からすべてをダウンロードします。

問題は、私のラップトップで実行されている devpi サーバーに pip がアクセスしないことです。どうすればそれを達成できますか?

4

2 に答える 2

4

1 つの答えは、devpi ヘルパー コンテナーです。docker devpi イメージを開始し、ポート 3141 を公開します。次に、docker ファイルの環境変数を使用して、これを pip install の追加ソースとして追加できます。

docker compose を使用して devpi を開始します。

devpi:
  image: scrapinghub/devpi
  container_name: devpi
  expose:
      - 3141
  volumes:
      - /path/to/devpi:/var/lib/devpi

myapp:
  build: .
  external_links:
   - devpi:devpi

docker-compose up -d devpi

ここで、クライアント Docker コンテナーを構成する必要があります。pip を構成する必要があります。

Dockerfile: ENV PIP_EXTRA_INDEX_URL= http://devpi:3141/root/pypi/+simple/ \ PIP_TRUSTED_HOST=devpi

コンテナにログインして、動作していることを確認します。

docker-compose run myapp bash

pip install --verbose nose

出力には以下が含まれる必要があります

  2 location(s) to search for versions of nose:
  * https://pypi.python.org/simple/nose/
  * http://devpi:3141/root/pypi/+simple/nose/

別のコンテナーまたは sftp からコンテナーにパッケージをアップロードできるようになりました。

このアプローチには、ビルドを高速化するという利点がありますが、devpi コンテナーが存在しない場合でもビルドが壊れることはありません。

注: セキュリティ上の問題があるため、強力なパスワードを使用せずにポートを devpi に公開しないでください。人々はそれを使用して、アプリケーションがインストールして実行する任意のコードをアップロードできます。

于 2015-12-23T22:39:54.817 に答える
3

localhostRUN行はコンテナー内で実行されるコマンドにすぎないため、ホストではなく、docker コンテナーを指します。したがって、ラップトップのネットワークで到達可能な IP を使用する必要があります。

短所: これにより、他の人が pypi ミラーを実行していない場合、Dockerfile は移植できなくなります。

于 2014-07-30T11:37:20.823 に答える