首页 > 解决方案 > 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

它无法找到yarnthomasowow/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"]

删除SHELLRUN 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
...

标签: dockergithub-actions

解决方案


问题似乎出在您的图像中,而不是您的 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 中使用版本管理器,我相信您的问题要么会消失,要么会简化为更简单的问题。


推荐阅读