Github 操作在容器中运行步骤

Tho*_*een 5 docker github-actions

目前,我正在尝试在我的 Github Actions 工作流程中实现一个容器。但是,我很难弄清楚如何在容器本身中运行步骤。

使用以下工作流程:

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
Run Code Online (Sandbox Code Playgroud)

此工作流程会导致以下错误:

/__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
Run Code Online (Sandbox Code Playgroud)

它无法找到yarnthomasowow/laravel-php:7.4本地运行可用yarn。我已经用 docker 镜像中应该可用的其他东西对此进行了测试,但也没有找到它们。看起来这些步骤没有在容器中执行。

该文档对语法进行了以下说明jobs.<job_id>.container

用于运行作业中尚未指定容器的任何步骤的容器

我知道有些解决方案无需使用容器即可工作,我更愿意使用它。

有人遇到同样的问题或者知道我做错了什么吗?


解决方案

@DannyB 指出我的图像包含以下入口点:

["/bin/bash", "--login", "-c", "tail -f /dev/null"]
Run Code Online (Sandbox Code Playgroud)

这可能是 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"]
Run Code Online (Sandbox Code Playgroud)

删除SHELL解决RUN npm ...了问题,Github 能够再次正确运行容器中的内容。

目前,如果没有旧的解决方案,我仍然无法安装纱线,但我认为还有其他方法可以做到这一点。有人建议如何以干净的方式做到这一点吗?


安装节点和纱线

我能够使用此答案node获取并安装。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
Run Code Online (Sandbox Code Playgroud)

COPY对办公室 Node docker 镜像进行了一些尝试。有了这个解决方案,我就可以开始node工作了。npm并且yarn也在运行但有错误。

["/bin/bash", "--login", "-c", "tail -f /dev/null"]
Run Code Online (Sandbox Code Playgroud)

Dan*_*nyB 5

问题似乎出在您的图像中,而不是您的 GitHub Actions 语法中。

您的入口点似乎是:

["/bin/bash", "--login", "-c", "tail -f /dev/null"]
Run Code Online (Sandbox Code Playgroud)

这与 GitHub Actions 的需求不兼容 - 因为它根本无法通过该入口点进入您的容器。

您可能需要将入口点更改为其标准/bin/sh/bin/bash入口点。在您期望 GitHub Actions 能够处理它之前,请确保您可以在本地进行 bash 操作。

$ docker run --rm -it thomasowow/laravel-php:7.4 bash
Run Code Online (Sandbox Code Playgroud)

作为“容器沙箱”概念证明,您可以尝试以下操作,并查看它是否按照广告宣传的那样工作。

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 /
Run Code Online (Sandbox Code Playgroud)

此外,您也许可以指示 GitHub Actions 使用不同的入口点,如下所示:

container: 
  image: thomasowow/laravel-php:7.4
  options: "--entrypoint /bin/bash"
Run Code Online (Sandbox Code Playgroud)

但是,首先,您需要确保它在本地工作,如下所示:

$ docker run --rm -it --entrypoint='' thomasowow/laravel-php:7.4 yarn
Run Code Online (Sandbox Code Playgroud)

关于安装纱线的更新

添加到答案,因为您添加了问题。大多数情况下,在 docker 镜像中安装东西应该是直接的,包括节点和纱线之类的东西。

虽然我不是节点用户,但我怀疑问题在于您正在使用nvm. 在其他语言(python、ruby)中,这些“版本管理器”被设计为在交互式 shell 中运行,了解用户的环境和启动脚本。在 docker 内部,您不需要任何版本管理器 - 因为您不需要多个版本。

寻找“普通”安装依赖项的方法,并避免使用 Dockerfile 中的版本管理器,我确信您的问题要么会消失,要么会简化为更简单的问题。