目前,我正在尝试将一个contianer实现到我的Github操作工作流中。然而,我在弄清楚如何在容器本身中运行步骤时遇到了困难。
所使用的工作流如下:
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
可用。我已经测试了其他的东西,应该在码头的形象,他们也没有找到。看起来这些步骤没有在容器中执行。
用于陈述如下:语法的文档jobs.<job_id>.container
:
在作业中运行尚未指定容器的任何步骤的容器
我知道有些解决方案不需要使用容器,我更愿意使用它。
有人有同样的问题或者知道我做错了什么吗?
解决方案
@DannyB指出,我的图像包含以下切入点:
["/bin/bash", "--login", "-c", "tail -f /dev/null"]
这可能是Github无法正确运行容器中的东西的原因。
它们在映像中需要安装nvm、节点和纱线。
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
有人试图从office图像中获取COPY
。有了这个解决方案,我才能让node
工作起来。npm
和yarn
也在运行,但有错误。
COPY --from=node:12.18.3 /usr/local/bin/node /usr/bin/node
...
发布于 2020-08-18 18:26:55
问题似乎存在于您的映像中,而不是GitHub操作的语法中。
你的切入点似乎是:
["/bin/bash", "--login", "-c", "tail -f /dev/null"]
这与GitHub操作所需的内容不兼容--因为它根本无法使用该入口点进入容器。
您可能需要将入口点更改为标准的/bin/sh
或/bin/bash
入口点。在期望GitHub操作能够处理之前,请确保您可以在本地使用它。
$ 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操作使用不同的入口点,如下所示:
container:
image: thomasowow/laravel-php:7.4
options: "--entrypoint /bin/bash"
但是,首先,您需要确保它在本地工作,如下所示:
$ docker run --rm -it --entrypoint='' thomasowow/laravel-php:7.4 yarn
安装纱线的最新情况
加上答案,因为你加入了你的问题。大多数情况下,在码头映像中安装东西应该是直接的,包括节点和纱线。
虽然我不是节点用户,但我怀疑问题在于您使用的是nvm
。在其他语言(python、ruby)中,这些“版本管理器”设计为在交互式shell中运行,了解用户的环境和引导脚本。在docker内部,您不需要任何版本管理器--因为您不需要多个版本。
寻找安装依赖关系的方法“普通香草”,避免Dockerfiles中的版本管理器,我相信您的问题会消失,或者简化为简单的问题。
https://stackoverflow.com/questions/63472909
复制相似问题