如何 运行 将多个命令合而为一 Github 操作 Docker
How to run multiple commands in one Github Actions Docker
运行在一个 action
中使用多个命令的正确方法是什么?
例如:
我想运行一个python脚本作为action
。在 运行 安装此脚本之前,我需要安装 requirements.txt
.
我可以想到几个方案:
- 创建一个
Dockerfile
,其中包含命令 RUN pip install -r requirements.txt
。
- 使用
python:3
图像,运行 entrypoint.sh
文件中的 pip install -r requirements.txt
,然后 运行 在 args
中使用参数main.workflow
.
- 同时使用
pip install
和 python myscript.py
作为 args
另一个例子:
我想 运行 我的存储库中存在的脚本,然后比较 2 个文件(它的输出和一个已经存在的文件)。
这是一个包含两个命令的过程,而在第一个示例中,pip install
命令可以被视为一个构建命令 而不是测试命令。
问题:
我可以为另一个命令创建另一个 Docker,它将包含前一个 Docker 的输出吗?
我正在寻找 Dockerfile
、entrypoint
或 args
.
中命令位置的指南
您可以在 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
returns ``。但是 运行 像 bash myscript.sh -xe
一样按预期工作。
如果你想运行这个在docker机器里面,一个选项可能是运行一些像你这样的东西run
子句:
docker exec -it pseudoName /bin/bash -c "cd myproject; pip install -r requirements.txt;"
关于 "create another Docker for another command, which will contain the output of the previous Docker",您可以在 docker 文件上使用 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
的结果保存到一个文件中,这个文件复制到第二阶段,可以运行对结果进行任意检查。
运行在一个 action
中使用多个命令的正确方法是什么?
例如:
我想运行一个python脚本作为action
。在 运行 安装此脚本之前,我需要安装 requirements.txt
.
我可以想到几个方案:
- 创建一个
Dockerfile
,其中包含命令RUN pip install -r requirements.txt
。 - 使用
python:3
图像,运行entrypoint.sh
文件中的pip install -r requirements.txt
,然后 运行 在args
中使用参数main.workflow
. - 同时使用
pip install
和python myscript.py
作为args
另一个例子:
我想 运行 我的存储库中存在的脚本,然后比较 2 个文件(它的输出和一个已经存在的文件)。
这是一个包含两个命令的过程,而在第一个示例中,pip install
命令可以被视为一个构建命令 而不是测试命令。
问题:
我可以为另一个命令创建另一个 Docker,它将包含前一个 Docker 的输出吗?
我正在寻找 Dockerfile
、entrypoint
或 args
.
您可以在 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
returns ``。但是 运行 像 bash myscript.sh -xe
一样按预期工作。
如果你想运行这个在docker机器里面,一个选项可能是运行一些像你这样的东西run
子句:
docker exec -it pseudoName /bin/bash -c "cd myproject; pip install -r requirements.txt;"
关于 "create another Docker for another command, which will contain the output of the previous Docker",您可以在 docker 文件上使用 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
的结果保存到一个文件中,这个文件复制到第二阶段,可以运行对结果进行任意检查。