63

一个运行多个命令的正确方法是action什么?

例如:

我想将 python 脚本作为action. 在运行此脚本之前,我需要安装requirements.txt.

我可以想到几个选择:

  • Dockerfile使用其中的命令创建一个RUN pip install -r requirements.txt
  • 使用python:3图像,并在运行in中的参数之前运行pip install -r requirements.txtin文件。entrypoint.shargsmain.workflow
  • 同时使用pip installpython myscript.py作为args

另一个例子:

我想运行一个存在于我的存储库中的脚本,然后比较 2 个文件(它的输出和一个已经存在的文件)。

这是一个包含两个命令的过程,而在第一个示例中,该pip install命令可以被视为构建命令而不是测试命令。

问题:

我可以为另一个命令创建另一个 Docker,它将包含以前 Docker 的输出吗?

我正在寻找命令在 in Dockerfile、 inentrypoint或 in 中的位置指南args

4

1 回答 1

117

您可以使用属性|上的管道运行多个命令 。run看一下这个:

name: My Workflow

on: [push]

jobs:
  runMultipleCommands:
    runs-on: ubuntu-latest
    steps:
     - uses: actions/checkout@v1
     - run: |
        echo "A initial message"
        pip install -r requirements.txt
        echo "Another message or command"
        python myscript.py
        bash some-shell-script-file.sh -xe
     - run: echo "One last message"

在我的测试中,运行类似的 shell 脚本会./myscript.sh返回一个 ``. 但是bash myscript.sh -xe像预期的那样运行它。

我的工作流程文件| 结果

如果您想在 docker machinerun中运行它,可以在 you子句上运行类似这样的选项:

docker exec -it pseudoName /bin/bash -c "cd myproject; pip install -r requirements.txt;"

关于“为另一个命令创建另一个 Docker,它将包含先前 Docker 的输出”,您可以在 dockerfile 上使用multistage-builds 。一些喜欢:

## First stage (named "builder")
## Will run your command (using add git as sample) and store the result on "output" file
FROM alpine:latest as builder
RUN apk add git > ./output.log

## Second stage
## Will copy the "output" file from first stage
FROM alpine:latest
COPY --from=builder ./output.log .
RUN cat output.log
# RUN your checks
CMD []

这样,apk add git结果被保存到一个文件中,并且这个文件被复制到第二阶段,可以对结果进行任何检查。

于 2019-08-23T13:15:40.837 回答