Github Actions会在容器中运行步骤。

5

目前我正在尝试将一个容器集成到我的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

该工作流产生了以下错误:

/__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 能够在容器中正常运行。

目前我仍无法在不使用旧解决方案的情况下安装 yarn,但我认为还有其他方法可以解决。有人建议如何以清洁的方式做到这一点吗?


安装 node 和 yarn

我使用 这个答案 成功安装了 nodeyarn

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

尝试从办公室Node docker镜像中COPY。使用此解决方案,我能够使node正常运行。但是npmyarn运行时会出现错误。

COPY --from=node:12.18.3 /usr/local/bin/node /usr/bin/node
...

看到您更新的问题,我也更新了答案,希望能为您解决问题提供正确的方向。 - DannyB
1个回答

5
问题似乎出在您的图像上,而不是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

关于安装yarn的更新

针对你的问题,我想补充一些内容。通常情况下,在Docker镜像中安装东西,例如node和yarn,应该很直接。

尽管我不是Node用户,但我猜测问题可能出在使用了nvm。在其他语言(如Python、Ruby)中,“版本管理器”旨在在交互式shell中运行,知道用户的环境和启动脚本。在Docker中,你不需要版本管理器,因为你不需要多个版本。

寻找“纯基础”的依赖项安装方法,避免在Dockerfile中使用版本管理器,相信你的问题要么会消失,要么会变得更简单。


关于更新。你说得完全正确。确实没有必要为此使用版本管理器,我宁愿进行“纯净安装”。但看起来这是我能让它工作的最简单/最短的方法(我尝试了很多解决方案)。感谢你的回答! - Thomas Van der Veen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接