我正在使用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 vm上运行时,它没有选择任何依赖项。
编辑7/28/2020:
这是触发 Action 的工作流的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操作将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(因为它是根用户的主目录),因此virtualenv会在/root/.local/share/virtualenvs中创建。
但是,在docker run阶段,将HOME设置为/github/home(如上所述)。因此,将在/github/home/.local/share/virtualenvs中创建virtualenv。
总结一下-pipenv install使用/root/.local/share/virtualenvspipenv run使用/github/home/.local/share/virtualenvs这意味着将依赖项安装在一个位置,但是在实际运行脚本时,期望将其安装在其他位置。
为了克服这个问题,我们可以使用WORKON_HOME语句在Dockerfile中设置ENVWORKON_HOME尊重pipenv变量,它将更喜欢将其虚拟环境放置在WORKON_HOME定义的路径中,而不是HOME定义的路径中。
所以解决方案是添加ENV WORKON_HOME /rootDockerfile
但是,这还不够,因为pipenv根据pipenv文件的位置选择了virtualenv。 Github将--workdir设置为/github/workspace,然后将整个项目源代码安装到该文件夹​​中,因此当我们使用pipenv run时,我们实际上是在Pipenv中使用/github/workspace文件。这是与Pipenv阶段复制到docker build并用于/的文件不同的pipenv install文件。由于使用了两个不同的Pipenv位置,因此将使用两个不同的virtualenv。
为了解决这个问题,我们可以使用PIPENV_PIPEFILE环境变量。该变量告诉pipenv在该变量指定的位置而不是当前工作目录中查找Pipfile
让我们还将其添加到我们的Dockerfile中:
ENV PIPENV_PIPFILE /Pipfile

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

10-12 23:27