如何在 docker 中获取 pipenv 运行?
How to get pipenv running in docker?
我正在 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
正在运行...
所以有两个问题:第一:为什么 pipenv shell
给我这个错误,第二:为什么我必须在 pipenv install --system
之前做 pipenv install
才能让它工作?
我想使用 pipenv 创建具有不同 python 版本和不同依赖版本的虚拟环境。
考虑到你的问题,据我所知,最简单的方法是更新到最新版本的 pipenv
。它仍在开发中,所以问题很快就会得到解决。
我们在生产中使用 pipenv
和 docker
。我们真的很喜欢它。
有几点需要牢记:
- 您需要使用
--system
标志,因此它会将所有软件包安装到系统 python,而不是 virtualenv
。由于 docker
容器不需要 virtualenv
s
- 您需要使用
--deploy
标志,因此如果您的 Pipfile.lock
已过期,您的构建将失败
- 您需要使用
--ignore-pipfile
,这样它就不会干扰我们的设置
检查 the official docs 以确保此信息是 up-to-date。
总而言之:
pipenv install --system --deploy --ignore-pipfile
还有一件事。如果您在开发和生产中使用相同的 Dockerfile
,那么仅在开发环境中也使用 --dev
标志会非常好。
此外,查看我们的 django
项目模板以查看完整示例:wemake-django-template
这个问题的直接答案是不使用 shell
,而是 run
:
CMD ["pipenv", "run", "python", "my/app.py"]
如果您需要更大的灵活性,您也可以 pipenv run sh init.sh
,这将创建一个 shell,并使用所有 pipenv
环境变量进行初始化。
我实际上更喜欢 C. Sweet 提到的方法。如果您可以预先构建您的虚拟环境并简单地复制它(设置 PIPENV_VENV_IN_PROJECT
然后使用嵌套 FROM
后跟 COPY --from=builder-image
),则不需要 python
最终容器中也没有 pipenv
或 pipenv
依赖项。 大大 减小了最终图像的大小。
Dockerfile
:
WORKDIR /etc/service/
CMD ["sh", "/etc/service/init.sh"]
init.sh
:
source /etc/service/my/.venv/bin/activate
python my/app.py
pipenv 文档不再正式建议在 docker 实例中使用 --system
标志。相反,他们建议使用虚拟环境,如 "it is for deployment onto a full-fledged OS"。这是警告:
...most containers are deployed without virtualenvs as I believe you both note, I believe the purpose is to stay slim and reduce attack surface area by installing as little as possible
如https://github.com/pypa/pipenv/pull/2762所述。
相反,解决方案是 运行(如此处的不同答案所述):
RUN pipenv install --deploy --ignore-pipfile
然后在所有对 python 的调用前加上 pipenv run
,例如CMD ["pipenv", "run", "python", "hello.py"]
Ps。我本来想把它作为对已接受答案的评论,但我没有声誉。
最好不要直接使用 pipenv,因为您的容器中通常不需要 virtualenv。
有一个名为 micropipenv 的工具,您可以在容器中使用它来代替 pipenv。
https://github.com/thoth-station/micropipenv
micropipenv 使用案例
为什么我应该使用 micropipenv
而不是 Pipenv
或 Poetry
?
我想要一个“统领一切”的工具——一个轻量级的工具
支持所有 Python 依赖锁文件管理器(pip-tools、Poetry、Pipenv)
并让用户决定在部署 Python 应用程序时他们想使用什么
在容器化环境中(例如 Kubernetes、OpenShift 等)。
我想要一个快速、简约的软件安装工具
CI.
中的包
我希望容器化 Python 应用程序尽可能小
使用最少的软件交付并需要构建和 运行 Python
在生产中的应用。
我想将 Pipenv/Poetry 生成的文件转换为 pip-tools
兼容输出。
我不想安装 Pipenv/Poetry,但我想 运行 一个项目
使用 Pipenv/Poetry 进行依赖管理(例如受限环境)。
我的 Pipenv 安装坏了 Pipenv upstream did not issue any new Pipenv release <https://github.com/pypa/pipenv/issues/4058>
_.
我想将我的应用程序部署到生产环境和我的
应用程序依赖项由 Pipenv/Poetry 管理(依赖项是
已经解决),但我不想 运行 Pipenv/Poetry 在生产中(例如
OpenShift 的 s2i 构建过程)。
事实证明以下替代方案最适合我:
RUN pip install pipenv \
&& pipenv lock --keep-outdated --requirements > requirements.txt \
&& pip install -r requirements.txt
由于这不会在 pipenv'a virtualenv 中安装依赖项,因此无需担心 docker-compose 命令中的 pipenv。
command: >
- sh
- -c
- |
python myscript.py
python myapp.py
以下参考对我有帮助,包括诗歌、pip-tools
ReferenceP.S。我不是作者
我正在 docker:
安装 pipenvRUN 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
正在运行...
所以有两个问题:第一:为什么 pipenv shell
给我这个错误,第二:为什么我必须在 pipenv install --system
之前做 pipenv install
才能让它工作?
我想使用 pipenv 创建具有不同 python 版本和不同依赖版本的虚拟环境。
考虑到你的问题,据我所知,最简单的方法是更新到最新版本的 pipenv
。它仍在开发中,所以问题很快就会得到解决。
我们在生产中使用 pipenv
和 docker
。我们真的很喜欢它。
有几点需要牢记:
- 您需要使用
--system
标志,因此它会将所有软件包安装到系统 python,而不是virtualenv
。由于docker
容器不需要virtualenv
s - 您需要使用
--deploy
标志,因此如果您的Pipfile.lock
已过期,您的构建将失败 - 您需要使用
--ignore-pipfile
,这样它就不会干扰我们的设置
检查 the official docs 以确保此信息是 up-to-date。
总而言之:
pipenv install --system --deploy --ignore-pipfile
还有一件事。如果您在开发和生产中使用相同的 Dockerfile
,那么仅在开发环境中也使用 --dev
标志会非常好。
此外,查看我们的 django
项目模板以查看完整示例:wemake-django-template
这个问题的直接答案是不使用 shell
,而是 run
:
CMD ["pipenv", "run", "python", "my/app.py"]
如果您需要更大的灵活性,您也可以 pipenv run sh init.sh
,这将创建一个 shell,并使用所有 pipenv
环境变量进行初始化。
我实际上更喜欢 C. Sweet 提到的方法。如果您可以预先构建您的虚拟环境并简单地复制它(设置 PIPENV_VENV_IN_PROJECT
然后使用嵌套 FROM
后跟 COPY --from=builder-image
),则不需要 python
最终容器中也没有 pipenv
或 pipenv
依赖项。 大大 减小了最终图像的大小。
Dockerfile
:
WORKDIR /etc/service/
CMD ["sh", "/etc/service/init.sh"]
init.sh
:
source /etc/service/my/.venv/bin/activate
python my/app.py
pipenv 文档不再正式建议在 docker 实例中使用 --system
标志。相反,他们建议使用虚拟环境,如 "it is for deployment onto a full-fledged OS"。这是警告:
...most containers are deployed without virtualenvs as I believe you both note, I believe the purpose is to stay slim and reduce attack surface area by installing as little as possible
如https://github.com/pypa/pipenv/pull/2762所述。
相反,解决方案是 运行(如此处的不同答案所述):
RUN pipenv install --deploy --ignore-pipfile
然后在所有对 python 的调用前加上 pipenv run
,例如CMD ["pipenv", "run", "python", "hello.py"]
Ps。我本来想把它作为对已接受答案的评论,但我没有声誉。
最好不要直接使用 pipenv,因为您的容器中通常不需要 virtualenv。
有一个名为 micropipenv 的工具,您可以在容器中使用它来代替 pipenv。
https://github.com/thoth-station/micropipenv
micropipenv 使用案例
为什么我应该使用 micropipenv
而不是 Pipenv
或 Poetry
?
我想要一个“统领一切”的工具——一个轻量级的工具 支持所有 Python 依赖锁文件管理器(pip-tools、Poetry、Pipenv) 并让用户决定在部署 Python 应用程序时他们想使用什么 在容器化环境中(例如 Kubernetes、OpenShift 等)。
我想要一个快速、简约的软件安装工具 CI.
中的包我希望容器化 Python 应用程序尽可能小 使用最少的软件交付并需要构建和 运行 Python 在生产中的应用。
我想将 Pipenv/Poetry 生成的文件转换为 pip-tools 兼容输出。
我不想安装 Pipenv/Poetry,但我想 运行 一个项目 使用 Pipenv/Poetry 进行依赖管理(例如受限环境)。
我的 Pipenv 安装坏了
Pipenv upstream did not issue any new Pipenv release <https://github.com/pypa/pipenv/issues/4058>
_.我想将我的应用程序部署到生产环境和我的 应用程序依赖项由 Pipenv/Poetry 管理(依赖项是 已经解决),但我不想 运行 Pipenv/Poetry 在生产中(例如 OpenShift 的 s2i 构建过程)。
事实证明以下替代方案最适合我:
RUN pip install pipenv \
&& pipenv lock --keep-outdated --requirements > requirements.txt \
&& pip install -r requirements.txt
由于这不会在 pipenv'a virtualenv 中安装依赖项,因此无需担心 docker-compose 命令中的 pipenv。
command: >
- sh
- -c
- |
python myscript.py
python myapp.py
以下参考对我有帮助,包括诗歌、pip-tools ReferenceP.S。我不是作者