我编写的 GitHub Action 无法访问调用该操作的存储库文件

2023-12-21

带有我正在处理的目录结构的示例存储库位于GitHub 在这里 https://github.com/alexanderdamiani/parameterizable-docker-action-example。要运行 GitHub Action,您只需转到存储库的 Action 选项卡并手动运行 Action。


我也写了一个自定义的 GitHub Actionpython作为 Docker 容器中的基础镜像,但想要python版本作为 GitHub Action 的输入。为此,我创建了第二个中间 Docker 容器来运行python版本输入参数。

我遇到的问题是我无法访问调用 GitHub Action 的原始存储库文件。例如,假设存储库名为python-sample-project并具有文件夹结构:

python-sample-project
│   main.py
│   file1.py    
│
└───folder1
│   │   file2.py

I see main.py, file1.py, and folder1/file2.py in entrypoint.sh。然而,在docker-action/entrypoint.sh我只看到linux文件夹结构和entrypoint.sh文件复制到docker-action/Dockerfile.

在我使用的 Alpine 示例中,操作entrypoint.sh脚本看起来像这样:

#!/bin/sh -l
ALPINE_VERSION=$1
cd /docker-action
docker build -t docker-action --build-arg alpine_version="$ALPINE_VERSION" . && docker run docker-action

In docker-action/我有一个Dockerfile and entrypoint.sh应该使用动态版本的 Alpine(或 Python)为内部容器运行的脚本

The docker-action/Dockerfile如下:

# Container image that runs your code
ARG alpine_version
FROM alpine:${alpine_version}

# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh

RUN ["chmod", "+x", "/entrypoint.sh"]

# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]

In the docker-action/entrypoint I run ls但我没有看到存储库文件。

是否可以访问main.py, file1.py, and folder1/file2.py in entrypoint.sh in the docker-action/entrypoint.sh?


通常有两种方法可以从存储库中获取可供您构建和运行的 Docker 容器使用的文件。您可以 (1) 在构建映像时将文件添加到映像中,或者 (2) 在运行映像时将文件装载到容器中。还有其他一些方法,例如指定卷,但这可能超出了本例的范围。

Dockerfiledocker-action/Dockerfile不复制任何文件,除了entrypoint.sh脚本。你的entrypoint.sh运行容器时也不提供任何挂载点。因此,您观察到的结果是基于这些事实的预期结果。

为了解决这个问题,您必须 (1) 添加COPY/ADD对 Dockerfile 执行以下语句,将文件复制到映像中(并设置适当的构建上下文)或 (2) 在运行时将文件安装到容器中,方法是添加-v /source-path:/container-path to the docker run命令在你的entrypoint.sh.

参见参考资料:

  • COPY 参考 https://docs.docker.com/engine/reference/builder/#copy
  • Docker 运行参考 https://docs.docker.com/engine/reference/commandline/run

不过,这种构建另一个容器只是为了获取用户提供的 python 版本的方法对于 GitHub Actions 来说是一种非常值得怀疑的做法,应该避免。考虑依靠安装Python https://github.com/actions/setup-python行动代替。

docker-in-docker 问题

然而,如果您继续此路线并想要安装目录,则必须记住,在调用时docker在 GitHub 上的 docker 操作中,挂载规范中的文件系统是指 docker 主机的文件系统,而不是容器的文件系统。

它可以在我的机器上运行吗?

与您跑步时可能遇到的情况相反docker例如,在本地系统上,这在 GitHub 中不起作用——工作目录未安装:

docker run -v $(pwd):/opt/workspace \
           --workdir /opt/workspace \ 
           --entrypoint /bin/ls \
           my-container "-R"

这也不起作用:

docker run -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE \
           --workdir $GITHUB_WORKSPACE \ 
           --entrypoint /bin/ls \
           my-container "-R"

如果你在本地运行 docker 的系统上尝试的话,这种事情会工作得很好。是什么赋予了?

对付恶魔(守护进程)

在操作中,文件检出到的起始工作目录$GITHUB_WORKSPACE。在 docker actions 中,就是/github/workspace。工作区文件将在以下情况下填充到工作区中:your由 Actions 运行程序运行的操作mounting运行 docker 守护进程的主机的工作区。

您可以在操作开始时运行的命令中看到:

/usr/bin/docker run --name f884202608aa2bfab75b6b7e1f87b3cd153444_f687df --label f88420 --workdir /github/workspace --rm -e INPUT_ALPINE-VERSION -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_RETENTION_DAYS -e GITHUB_RUN_ATTEMPT -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 GITHUB_ACTION_REPOSITORY -e GITHUB_ACTION_REF -e GITHUB_PATH -e GITHUB_ENV -e RUNNER_OS -e RUNNER_NAME -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/_temp/_runner_file_commands":"/github/file_commands" -v "/home/runner/work/my-repo/my-repo":"/github/workspace" f88420:2608aa2bfab75b6b7e1f87b3cd153444  "3.9.5"

重要的是:

-v "/home/runner/work/my-repo/my-repo":"/github/workspace" 
-v "/var/run/docker.sock":"/var/run/docker.sock"

/home/runner/work/my-repo/my-repo是主机上存储库文件所在的路径。如前所述,第一行是将其安装到/github/workspace当它运行时在你的操作容器中。

第二行是将 docker 套接字从主机安装到操作容器。这意味着任何时候你打电话docker在您的操作中,您实际上是在与容器外部的 docker 守护进程进行对话。这很重要,因为这意味着当you使用-v争论inside您的操作中,参数需要反映容器外部存在的目录。

所以,你实际上需要做的是:

docker run -v /home/runner/work/my-repo/my-repo:/opt/workspace \
           --workdir /opt/workspace \ 
           --entrypoint /bin/ls \
           my-container "-R"

成为对别人有用的人

那行得通。如果您仅将其用于项目本身。但是,如果您希望其他项目可以使用此操作,那么您(除其他外)还有一个遗留问题。您如何知道工作区在主机上的位置?毕竟,每个存储库的该路径都会改变。 GitHub 也不保证这些路径。它们在不同平台上可能有所不同,或者您的操作可能在自托管运行器上运行。

那么你对这个问题满意吗?不幸的是,没有内置的环境变量指向您特别需要的这个目录。但是,通过依赖实现细节,您可能能够摆脱使用$RUNNER_WORKSPACE变量,在本例中将指向/home/runner/work/your-project。这里和原产地不是同一个地方$GITHUB_WORKSPACE但已经很接近了。您可以使用GITHUB_REPOSITORY变量来构建路径,尽管不能保证始终如此:afaik:

PROJECT_NAME="$(basename ${GITHUB_REPOSITORY})"
WORKSPACE="${RUNNER_WORKSPACE}/${PROJECT_NAME}"

您还需要修复一些其他问题,例如您构建的工作目录形式。

TL;DR

运行时需要在容器中挂载文件。在 GitHub 中,您正在运行 docker-in-docker,因此您需要用于挂载文件的路径会有所不同,因此您需要找到要传递到的正确路径docker当从操作容器内调用时。

您链接的示例项目的最低工作解决方案是这样的entrypoint.sh在仓库的根目录中看起来像这样:

#!/usr/bin/env sh
ALPINE_VERSION=$1

docker build -t docker-action \
             -f ./docker-action/Dockerfile \
             --build-arg alpine_version="$ALPINE_VERSION" \
             ./docker-action

PROJECT_NAME="$(basename ${GITHUB_REPOSITORY})"
WORKSPACE="${RUNNER_WORKSPACE}/${PROJECT_NAME}"

docker run --workdir=$GITHUB_WORKSPACE \
           -v $WORKSPACE:$GITHUB_WORKSPACE \
           docker-action "$@"

您的操作可能还有更多问题,具体取决于它的作用,例如为“内部”容器提供该操作的所有默认和用户定义的环境变量(如果这很重要)。

那么,这可能吗?当然。仅仅获得 alpine/python 的动态版本是否合理?我不这么认为。可能有更好的方法来完成你想做的事情,比如使用setup-python,但这听起来像是一个不同的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我编写的 GitHub Action 无法访问调用该操作的存储库文件 的相关文章

  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • Github 页面 - 禁用除单个站点之外的所有站点的自定义域重定向?

    I ve been using github pages since a long time and use the custom domain redirection feature to redirect my user website
  • 如何将 ascii 值列表转换为 python 中的字符串?

    我在 Python 程序中有一个列表 其中包含一系列数字 这些数字本身就是 ASCII 值 如何将其转换为可以在屏幕上回显的 常规 字符串 您可能正在寻找 chr gt gt gt L 104 101 108 108 111 44 32 1
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • 如何使用 Docker for Mac 向 docker awslogs 驱动程序提供凭证?

    我正在尝试使用泊坞窗awslogs 驱动程序 https docs docker com engine admin logging awslogs 并收到以下错误 docker 来自守护程序的错误响应 无法初始化日志记录 驱动程序 NoCr
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • 如何使用 CodeBlocks 安装 Boost 库?

    我的发言即将结束了 我正在研究保存文件和序列化 结果发现 C 不具备 Python 所具有的那种原生序列化能力pickle 但幸运的是 它有 Boost 所以我开始寻求在我的系统上安装 Boost 1 47 以便能够序列化我的对象 但到目前
  • Symfony 4.1 - CORS 问题

    我的 symfony 4 1 API 有一些问题 我正在通过使用 Angular httpclient 的离子应用程序使用我的 API 我的问题尤其是 CORS 标头Access Control Allow Methods 我遇到了 COR
  • Jackson 3rd Party 类没有默认构造函数

    我正在尝试使用 Jackson 从 Json 读取 写入我的 POJO 截至目前 我已对其进行配置并可用于我的课程 第三方课程除外 当尝试读取 Json 时 出现错误 org codehaus jackson map JsonMapping
  • 正则表达式中的“?i”和“?-i”是什么意思?

    有人可以解释一下什么吗 i and i 用正则表达式包裹一个单词是什么意思 i test i 我测试过并且匹配test TEST and teSt 但我以前从未见过这个 什么是 before i意思是 我看到了这个here https gi
  • iPhone 长 plist

    我有一些数据想要添加到我的应用程序中 大约 650 个类别 包括名称 ID 号 每个类别平均有 85 个项目 每个类别都有一个名称 ID 号 iPhone会支持这么大的plist吗 我想首先在 UITableView 中显示类别 当选择一个
  • JSON 是否应该包含空值 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在创建一个以 JSON 形式返回结果的 API 当值为空时是否应该在结果中包含键是否有当前的最佳实践 例如 title Foo Bar au
  • 如何访问在 try 语句中初始化的对象

    我是 C 新手 想知道您是否可以执行以下操作 或者您是否有更好的方法 我的数据库处理程序有一个自定义异常类 我在主程序中使用它 如下所示 int main int argc char const argv try DatabaseHandl
  • 如何在 IntelliJ 中更改 Kotlin 的“此属性有支持字段”代码编辑器突出显示?

    天哪 IntelliJ 的这种默认颜色突出显示令人眼花缭乱 我怎样才能改变这个 您可以像修改任何其他语法突出显示一样修改 Kotlin 颜色突出显示 你会在下面找到它Preferences gt Colors Fonts gt Kotlin
  • 使用双 SIM 卡功能时如何获取 PhoneStateListener

    所以我目前正在 Android 中为双 SIM 卡设备实现呼叫转移功能 为了读取 SIM 卡呼叫转移的当前状态 启用 禁用 我执行以下操作 我创建一个TelephonyManager object val telephonyManager
  • 更改 SQL 中序列号的位置

    我有一个名为学生的表 结构如下 AdmissionNo RollNo Name 1001 1 A 1003 2 B 1005 3 C 1006 4 D 1008 5 E 现在我想将 rollno 4 更改为 2 并增加即将到来的数字 所以结
  • Logstash mutate 添加 json 中的所有字段

    我正在使用 Logstash 插件 logstash input rethinkdb 该插件获取数据库中的所有编辑并输出包含以下结构的 json 对象 db itjobs table countries old val null new v
  • 用于判断网站是否正常运行的批处理脚本

    我的问题是 ping 无法告诉我网站是打开还是关闭 我需要知道该网站是打开还是关闭 如果没有启动 请重新启动脚本 如果有人能帮助我那就太好了 我唯一能想到的就是抓取网站的内容并查看它是否已启动 我想在带有 Apache Tomcat 的服务
  • .htaccess 标头被 Apache 忽略

    我有一个使用相同核心的网站 htaccess与许多其他网站一样详细 但是该网站无法正确加载 htaccess指令 给出一组基本的 HTTP 标头 HTTP 1 1 200 OK Date Mon 12 Nov 2018 09 34 28 G
  • ggforce facet_zoom - 仅在缩放示例上添加标签

    我想在散点图中标记点 但仅限于那些在散点图中facet zoom控制板 这是一个例子 library ggplot2 library ggforce library ggrepel library magrittr labels lt le
  • CSS 变换:旋转仅适用于图像

    我有这个代码 div img src image png height 40 width 160 div
  • 功能区工具栏和 Visual Studio 2008 Service Pack 1

    今天我在听Hansel 分钟显示有关 NET 3 5 SP1 里面有什么 http www hanselminutes com default aspx showID 145 并且他们两次提到 Visual Studio 2008 Serv
  • 如何在不扩展 Activity 的类中使用 getIntent() ?

    我试图从类 Play 传递一个字符串 该类通过使用以下方法扩展 Activity Bundle data new Bundle Intent i new Intent Play this Receive class String categ
  • 如何禁用 html 代码块的基础或引导样式?

    我正在使用mailgun 尽管这个问题与mailgun无关 来解析传入的电子邮件 并且mailgun会将解析后的电子邮件http发布到我的服务器 当我收到帖子时 我得到了多部分电子邮件的 html 代码 我想向我的用户显示 html 电子邮
  • ngswitch 和 ng-repeat 在同一元素上产生干扰

    我在 Angular 中遇到了我没有预料到的行为 这篇文章的目的是找出这是一个错误还是有意为之 并可能解释为什么这样做 首先看看这个Plunker http plnkr co edit CB7k9r p preview http plnkr
  • 我编写的 GitHub Action 无法访问调用该操作的存储库文件

    带有我正在处理的目录结构的示例存储库位于GitHub 在这里 https github com alexanderdamiani parameterizable docker action example 要运行 GitHub Action