python - 您如何在 GitHub 操作中使用 pipenv?

标签 python docker github-actions pipenv

我正在使用 pipenv 为 GitHub 操作安装 python 依赖项。这是我的 pipfile 的样子:

name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
pylint = "*"

[packages]
pandas = "*"
pygithub = "*"
matplotlib = "*"

[requires]
python_version = "3.8"
这是 Dockerfile 的样子:
FROM python:3

COPY main.py /
COPY Pipfile /
COPY Pipfile.lock /
COPY views.csv /

# https://github.com/pypa/pipenv/issues/4273
RUN pip install 'pipenv==2018.11.26'
RUN pipenv install --deploy --ignore-pipfile

ENTRYPOINT ["pipenv", "run", "python", "./main.py"
我可以在我的机器上本地运行 docker 镜像,一切都按预期工作,但是当我将它推送到 GitHub 时,它失败了:
Virtualenv location: /github/home/.local/share/virtualenvs/workspace-0SZQOxG8
Traceback (most recent call last):
  File "./main.py", line 1, in <module>
    from github import Github
ModuleNotFoundError: No module named 'github'
出于某种原因,当 docker 镜像在 GitHub 虚拟机上运行时,它不会获取任何依赖项。
2020 年 7 月 28 日编辑:
这是触发操作的工作流的 main.yml。
on: 
  push: 
    branches: 
      - master


# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "insights_job"
  insights_job:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
    # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
    - uses: actions/checkout@v2
      
    - name: GitHub insights 
      id: insights
      uses: ./

最佳答案

精简版
只需将其添加到 Dockerfile 的顶部:

# Tells pipenv to create virtualenvs in /root rather than $HOME/.local/share.
# We do this because GitHub modifies the HOME variable between `docker build` and
# `docker run`
ENV WORKON_HOME /root

# Tells pipenv to use this specific Pipfile rather than the Pipfile in the 
# current working directory (the working directory changes between `docker build` 
# and `docker run`, this ensures we always use the same Pipfile)
ENV PIPENV_PIPFILE /Pipfile
长版
可以看出here , Github Action 定义了 HOME环境变量为 /github/home .
我们可以看到这个变量随后通过 run 传递给了 docker 容器。在操作的步骤日志中可见的命令:
/usr/bin/docker run --name c201c6ad6ba986775dbb96d3c072d294f3c8_a057c6 --label 87c201 --workdir /github/workspace --rm -e HOME -e GITHUB_JOB -e GITHUB_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_REPOSITORY_OWNER -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_ACTOR -e GITHUB_WORKFLOW -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GITHUB_EVENT_NAME -e GITHUB_SERVER_URL -e GITHUB_API_URL -e GITHUB_GRAPHQL_URL -e GITHUB_WORKSPACE -e GITHUB_ACTION -e GITHUB_EVENT_PATH -e RUNNER_OS -e RUNNER_TOOL_CACHE -e RUNNER_TEMP -e RUNNER_WORKSPACE -e ACTIONS_RUNTIME_URL -e ACTIONS_RUNTIME_TOKEN -e ACTIONS_CACHE_URL -e GITHUB_ACTIONS=true -e CI=true -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" -v "/home/runner/work/j/j":"/github/workspace" 87c201:c6ad6ba986775dbb96d3c072d294f3c8
(注意 -e home 标志)pipenv install$HOME/.local/share/virtualenvs 中创建一个 virtualenv并在该目录中安装所有依赖项。 pipenv run ...然后使用相同的路径找到 virtualenv 来运行所需的命令。
在 Docker 镜像 ( docker build ) 的构建阶段,$HOME具有默认值 /root (因为那是 root 用户的主目录),所以 virtualenv 在 /root/.local/share/virtualenvs 中创建.
然而,在docker run期间舞台,HOME设置为 /github/home (如上所述)。因此,virtualenv 在 /github/home/.local/share/virtualenvs 中创建.
总结一下——pipenv install用途 /root/.local/share/virtualenvspipenv run用途 /github/home/.local/share/virtualenvs这意味着依赖项安装在一个位置,但在实际运行脚本时预计会在不同的位置。
为了克服这个问题,我们可以使用 set WORKON_HOME在 Dockerfile 中使用 ENV陈述。WORKON_HOME pipenv 尊重变量并且它更愿意将其虚拟环境放置在 WORKON_HOME 中定义的路径中而不是 HOME 中定义的路径.
所以解决方案是添加ENV WORKON_HOME /rootDockerfile .
然而,这还不够,因为 pipenv 是根据 pipenv 的位置来选择 virtualenv 的。文件。 --workdir设置为 /github/workspace通过 Github 然后将整个项目源代码挂载到该文件夹​​中,所以当我们 pipenv run我们实际上使用的是 Pipenv文件在 /github/workspace .这是一个不同的 Pipenv文件比在 docker build 期间复制的文件登入/这用于 pipenv install .由于使用了两个不同的 Pipenv 位置,因此将使用两个不同的 virtualenv。
为了解决这个问题,我们可以使用 PIPENV_PIPEFILE环境变量。这个变量告诉 pipenv寻找Pipfile在该变量指定的位置而不是当前工作目录中。
让我们也将它添加到我们的 Dockerfile 中:
ENV PIPENV_PIPFILE /Pipfile

关于python - 您如何在 GitHub 操作中使用 pipenv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63143360/

相关文章:

python - 使用条件比较两个 Pandas boolean 值列

command-line-interface - 尝试在 Github Action 中解析 JSON 输出

github - 如何使用 Github Actions 进行 SFTP?

python - 如何从复杂的 JSON API 返回嵌套值

python - 合并两个字符串以缩短它们

python - 使用 pybind11 嵌入 python。虚拟环境不行

Django + docker + 周期性命令

maven - 在容器中安装 Docker 供 GitLab CI 构建使用

mysql - 连接到在 Docker 容器中运行的 MySql 服务器

GitHub Actions 无法通过 SSH 加载,尽管它似乎使用 ssh-access 工作