web-dev-qa-db-ja.com

Dockerでpipenvを実行するにはどうすればよいですか?

私のdockerにpipenvをインストールしています:

RUN pip install pipenv
RUN cd /my/app/path/ && pipenv install
RUN cd /my/app/path/ && pipenv Shell

エラーが発生しています:

Traceback (most recent call last):
  File "/usr/local/bin/pipenv", line 11, in <module>
    sys.exit(cli())
  File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 2057, in Shell
    do_Shell(three=three, python=python, fancy=fancy, Shell_args=Shell_args)
  File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 1952, in do_Shell
    Shell = os.path.abspath(PIPENV_Shell)
  File "/usr/lib/python2.7/posixpath.py", line 360, in abspath
    if not isabs(path):
  File "/usr/lib/python2.7/posixpath.py", line 54, in isabs
    return s.startswith('/')
AttributeError: 'NoneType' object has no attribute 'startswith'

走ったら

RUN cd /my/app/path/ && pipenv install --system 

代わりに、別のエラーが発生します:

build   30-Sep-2017 16:50:45    Step 5/9 : RUN cd /my/app/path &&     pipenv install --system
build   30-Sep-2017 16:50:45     ---> Running in cffd31633074
build   30-Sep-2017 16:50:46    [91mPipfile.lock not found, creating…
build   30-Sep-2017 16:50:46    [0m[91mLocking [dev-packages] dependencies…
build   30-Sep-2017 16:50:46    [0m[91mLocking [packages] dependencies…
build   30-Sep-2017 16:50:49    [0m[91mCRITICAL:pip.utils:Error [Errno 2] No such file or directory while executing command python setup.py Egg_info
build   30-Sep-2017 16:50:49    [0m[91mTraceback (most recent call last):
build   30-Sep-2017 16:50:49      File "/usr/local/bin/pipenv", line 11, in <module>
build   30-Sep-2017 16:50:49        sys.exit(cli())
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 722, in __call__
build   30-Sep-2017 16:50:49    [0m[91m    return self.main(*args, **kwargs)
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 697, in main
build   30-Sep-2017 16:50:49    [0m[91m    rv = self.invoke(ctx)
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 1066, in invoke
build   30-Sep-2017 16:50:49    [0m[91m    return _process_result(sub_ctx.command.invoke(sub_ctx))
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 895, in invoke
build   30-Sep-2017 16:50:49    [0m[91m    return ctx.invoke(self.callback, **ctx.params)
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 535, in invoke
build   30-Sep-2017 16:50:49        return callback(*args, **kwargs)
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 1782, in install
build   30-Sep-2017 16:50:49    [0m[91m    do_init(dev=dev, allow_global=system, ignore_pipfile=ignore_pipfile, system=system, skip_lock=skip_lock, verbose=verbose, concurrent=concurrent, deploy=deploy)
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 1290, in do_init
build   30-Sep-2017 16:50:49    [0m[91m    do_lock(system=system)
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 1080, in do_lock
build   30-Sep-2017 16:50:49    [0m[91m    pre=pre
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/utils.py", line 421, in resolve_deps
build   30-Sep-2017 16:50:49    [0m[91m    resolved_tree.update(resolver.resolve())
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/piptools/resolver.py", line 101, in resolve
build   30-Sep-2017 16:50:49    [0m[91m    has_changed, best_matches = self._resolve_one_round()
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/piptools/resolver.py", line 199, in _resolve_one_round
build   30-Sep-2017 16:50:49    [0m[91m    for dep in self._iter_dependencies(best_match):
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/piptools/resolver.py", line 293, in _iter_dependencies
build   30-Sep-2017 16:50:49        dependencies = self.repository.get_dependencies(ireq)
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/piptools/repositories/pypi.py", line 171, in get_dependencies
build   30-Sep-2017 16:50:49        result = reqset._prepare_file(self.Finder, ireq)
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/pip/req/req_set.py", line 639, in _prepare_file
build   30-Sep-2017 16:50:49    [0m[91m    abstract_dist.prep_for_dist()
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/pip/req/req_set.py", line 134, in prep_for_dist
build   30-Sep-2017 16:50:49    [0m[91m    self.req_to_install.run_Egg_info()
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/pip/req/req_install.py", line 438, in run_Egg_info
build   30-Sep-2017 16:50:49    [0m[91m    command_desc='python setup.py Egg_info')
build   30-Sep-2017 16:50:49      File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/pip/utils/__init__.py", line 667, in call_subprocess
build   30-Sep-2017 16:50:49    [0m[91m    cwd=cwd, env=env)
build   30-Sep-2017 16:50:49      File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
build   30-Sep-2017 16:50:49    [0m[91m    errread, errwrite)
build   30-Sep-2017 16:50:49      File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
build   30-Sep-2017 16:50:49    [0m[91m    raise child_exception
build   30-Sep-2017 16:50:49    OSError: [Errno 2] No such file or directory
error   30-Sep-2017 16:50:49    The command '/bin/sh -c cd /opt/supercrunch/function-service/lib &&     pipenv install --system' returned a non-zero code: 1
build   30-Sep-2017 16:50:49    [0mSending build context to Docker daemon 40.96 kB

しかし、私が代わりに次のことを行うとき:

RUN pip install pipenv
RUN cd /my/app/path && pipenv install
RUN cd /my/app/path && pipenv install --system

それは働いています...

2つの質問:最初:なぜpipenv Shellこのエラーが発生し、2番目:なぜする必要があるのか​​pipenv installpipenv install --system動作させるには?

Pipenvを使用して、異なるpythonバージョンと異なる依存バージョンの仮想環境を作成します。

25
Mulgard

あなたの問題を考えると、私が知っているように、最も簡単な方法はpipenvの最新バージョンに更新することです。まだ開発中であるため、問題はすぐに修正されます。

本番環境では、pipenvdockerを使用しています。そして、私たちは本当にそれが好きです。留意すべき点がいくつかあります。

  1. --systemフラグを使用する必要があるため、virtualenvではなくシステムpythonにすべてのパッケージがインストールされます。 dockerコンテナにはvirtualenvsが必要ないため
  2. --deployフラグを使用する必要があるため、Pipfile.lockが古い場合、ビルドは失敗します
  3. --ignore-pipfileを使用する必要があるため、セットアップが混乱しないようにします。

公式ドキュメント をチェックして、この情報が最新であることを確認してください。

概して:

pipenv install --system --deploy --ignore-pipfile

もう1つあります。開発と本番の両方に同じDockerfileを使用している場合、開発環境のみに--devフラグを使用することも非常に便利です。

また、Djangoプロジェクトテンプレートをチェックして、完全な例を確認してください。 wemake-Django-template

55
sobolevn

Pipenvのドキュメントでは、Dockerインスタンスで--systemフラグを使用することを公式に推奨しなくなりました。代わりに、「本格的なOSへの展開用」として、仮想環境の使用を提案します。これには注意が必要です。

...ほとんどのコンテナはvirtualenvを使用せずに展開されますが、あなたは両方のことに注意します

https://github.com/pypa/pipenv/pull/2762 に記載されているとおり。

代わりに、解決策は実行することです(別の回答に記載されています):

RUN pipenv install --deploy --ignore-pipfile

そして、pythonへのすべての呼び出しに接頭辞pipenv runを付けます。たとえば、CMD ["pipenv", "run", "python", "hello.py"]

追伸受け入れられた答えへのコメントとしてこれを置きたかったのですが、評判がありません。

7
Kalior

この質問に対する直接的な答えは、Shellではなくrunを使用することです。

CMD ["pipenv", "run", "python", "my/app.py"]

さらに柔軟性が必要な場合は、pipenv run sh init.shは、すべてのpipenv環境変数で初期化されたシェルを作成します。

私は実際にアプローチを好む C。Sweet 言及。仮想環境を事前に構築し、それをコピーするだけで済みます(設定PIPENV_VENV_IN_PROJECTその後、ネストされたFROMの後にCOPY --from=builder-image)、最終コンテナにpythonpipenvpipenv依存関係も必要ありません。これにより、大幅に最終画像のサイズが縮小されます。

Dockerfile

WORKDIR /etc/service/
CMD ["sh", "/etc/service/init.sh"]

init.sh

source /etc/service/my/.venv/bin/activate
python my/app.py
3
James Taylor