docker - Github 操作在容器中运行步骤
问题描述
目前我正在尝试在我的 Github Actions 工作流程中实现一个 contianer。但是,我很难弄清楚如何在容器本身中运行步骤。
使用以下工作流程:
name: Laravel
on: pull_request
jobs:
laravel-checks:
runs-on: ubuntu-latest
container: thomasowow/laravel-php:7.4
steps:
- uses: actions/checkout@v2
- name: Yarn
run: |
yarn
此工作流程导致以下错误:
/__w/_temp/c399fe7d-6cd2-4cdc-bb06-acc829cddbb8.sh: 1: /__w/_temp/c399fe7d-6cd2-4cdc-bb06-acc829cddbb8.sh: yarn: not found
##[error]Process completed with exit code 127
它无法找到yarn
。thomasowow/laravel-php:7.4
本地运行yarn
可用。我已经用 docker 映像中应该可用的其他东西对此进行了测试,但也没有找到它们。看起来这些步骤没有在容器中执行。
文档说明了以下jobs.<job_id>.container
语法:
用于运行作业中尚未指定容器的任何步骤的容器
我知道有些解决方案可以在不使用容器的情况下工作,我更愿意使用它。
有人有同样的问题或知道我做错了什么吗?
解决方案
@DannyB 指出我的图像包含以下入口点:
["/bin/bash", "--login", "-c", "tail -f /dev/null"]
这可能是 Github 无法在容器中正常运行的原因。
镜像中需要它们来安装 nvm、node 和 yarn
SHELL ["/bin/bash", "--login", "-c"]
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
RUN nvm install 12.18.3
RUN npm install -g yarn
CMD ["/bin/bash"]
删除SHELL
以RUN npm ...
解决问题,Github 能够再次在容器中正常运行。
目前,如果没有旧的解决方案,我仍然无法安装纱线,但我认为还有其他方法可以做到这一点。有人建议如何以干净的方式做到这一点?
安装节点和纱线
我能够使用这个答案node
获得并yarn
安装。
ENV NODE_VERSION=12.18.3
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
ENV NVM_DIR=/root/.nvm
RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm use v${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION}
ENV PATH="/root/.nvm/versions/node/v${NODE_VERSION}/bin/:${PATH}"
RUN npm install -g yarn
COPY
从办公室节点 docker 图像进行了一些尝试。有了这个解决方案,我就可以开始node
工作了。npm
并且yarn
也在运行但有错误。
COPY --from=node:12.18.3 /usr/local/bin/node /usr/bin/node
...
解决方案
问题似乎出在您的图像中,而不是您的 GitHub Actions 语法中。
您的入口点似乎是:
["/bin/bash", "--login", "-c", "tail -f /dev/null"]
这与 GitHub Actions 的需求不兼容——因为它根本无法使用该入口点进入您的容器。
您可能需要将入口点更改为其标准/bin/sh
或/bin/bash
入口点。在您期望 GitHub Actions 能够处理它之前,请确保您可以在本地对其进行 bash。
$ docker run --rm -it thomasowow/laravel-php:7.4 bash
作为“容器沙箱”概念验证,您可以尝试以下操作,并查看它是否像宣传的那样工作。
name: Experiment
on: [push]
jobs:
debug:
runs-on: ubuntu-latest
container: { image: alpine }
steps:
- run: uname -a
- run: cat /etc/alpine-release
- run: touch /hello
- run: ls /
此外,您也许可以通过以下方式指示 GitHub Actions 使用不同的入口点:
container:
image: thomasowow/laravel-php:7.4
options: "--entrypoint /bin/bash"
但是,首先,您需要确保它在本地工作,如下所示:
$ docker run --rm -it --entrypoint='' thomasowow/laravel-php:7.4 yarn
关于安装纱线的更新
添加到答案,因为您添加到您的问题。在 docker 镜像中安装东西在大多数情况下应该是直截了当的,包括 node 和 yarn 之类的东西。
虽然我不是节点用户,但我怀疑问题在于您使用的是nvm
. 在其他语言(python、ruby)中,这些“版本管理器”设计为在交互式 shell 中运行,了解用户的环境和启动脚本。在 docker 内部,您不需要任何版本管理器 - 因为您不需要多个版本。
寻找安装依赖项“plain vanilla”的方法,并避免在 Dockerfiles 中使用版本管理器,我相信您的问题要么会消失,要么会简化为更简单的问题。
推荐阅读
- amazon-web-services - 如何将一个 AWS 账户中的用户访问权限授予另一个账户中的 AWS 数据管道?
- php - Telegram Bot - 无法使用 PHP 删除自定义键盘
- java - BCECPublicKey 到指纹
- c++ - reference_wrapper:make_pair VS 类模板参数推导(CTAD)
- sql - 生成 15 分钟的日期间隔并加入匹配的行
- html - Foundation 6 Abide - 如何实现 formnovalidate
- cocoa - drawWithFrame: 将 NSTextFieldCell 背景从框架中注册出来
- android - 如何避免android vm释放一些单例
- powerbi - 在 PowerBI 中将 UNIX 时间转换为日期时出错
- java - 从数据库android错误中检索数据