运行docker镜像时如何传递shell参数?

运行docker镜像时如何传递shell参数?

我已经实现了一个 bash 脚本,它接受以下参数

SYNOPSIS
run.sh: run.sh [-H|-L|-P profile -D device [-R runtime]]
        list the fio profiles natively supported by the docker images or
        execute the selected profile on the targe devices within given
        duration, notice that the option L and P, D, R are mutually exclusive
                   
        Options:
          -H display this message
          -L list the profiles supported by the docker
          -P the profile name need to execute
          -D the device name(s) need to start FIO jobs, support format as /dev/vd[a-b]
          -R the exeuction time, optional, will run forever if not specified

# use case1:list all the profiles
# ./run.sh -L
###################################
#         Profiles supported      #
###################################
fio_profile_1.py
fio_profile_2.py
fio_profile_3.py
fio_profile_4.py

# use case2, start FIO job with profile_1 on vdb2 for 30 seconds
./run.sh -P fio_profile_1.py -D '/dev/vdb2' -R 30

我已将此脚本包装到 docker 中,并在 docker 文件中包含以下部分

EXPOSE 8000
ENTRYPOINT ["/bin/sh", "/opt/runall.sh"]

我可以通过使用以下命令执行 docker 来传递参数吗?

docker run --privileged -v /dev:/dev -v workspace:/root  --rm fiotools/tool-aio:latest -P 'fio_profile_1.py' -D '/dev/vdb2' -R 39

但是,我现在面临另一个问题,脚本在执行过程中可以按预期显示FIO的输出,但在使用docker运行时无法显示

# running with docker
# docker run --privileged -v /dev:/dev -v workspace:/root --attach stdout --rm fiotools/tool-aio:latest -P 'fio_profile_1.py' -D '/dev/vdb2' -R 39
working on the workspace /root/job.2023_02_06_16_21_32
# 

# running with shell inside the docker
# ./run.sh -P 'fio_profile_1.py' -D '/dev/vdb2' -R 39
working on the workspace /root/job.2023_02_06_16_25_13
Jobs: 1 (f=1): [m(1)][15.4%][r=46.9MiB/s,w=20.5MiB/s][r=5999,w=2622 IOPS][eta 00m:33s]

bash 脚本(run.sh)只不过是执行如下所示的 fio 命令,我可以知道如何输出 FIO 输出吗?

    echo "working on the workspace ${target}"
    ... ...
    cd ${target} && fio --write_bw_log=rw --write_iops_log=rw --write_lat_log=rw --output=fio.output --output-format=json $jobfiles

    fio2gnuplot -t ${job}-bw -b -g -p '*_bw*'
    fio2gnuplot -t ${job}-iops -i -g -p '*_iops*'

答案1

你应该更改CMD ["/opt/run.sh"]ENTRYPOINT [] ....

你可以使用这个:

ENTRYPOINT /opt/run.sh $@

或者(我建议你使用这个选项,因为上面的选项可能有问题)

ENTRYPOINT ["/bin/sh", "/opt/run.sh"]

确保/opt/run.sh具有执行权限。

为了运行 docker 镜像(一旦构建完成),运行如下命令:

docker run --rm image:latest -P fio_profile_1.py -D '/dev/vdb2' -R 30

另请注意,在您的脚本中您有以下内容:

-P the profile name need to execute

因此,在运行 docker 映像并指定该参数(以及文件)时,您将收到错误,因为该文件在 docker 容器中不存在。

一种可能的解决方案是使用 来将文件作为卷传递-v,如下所示:

docker run --rm -v /path/to/fio_profile_1.py:/fio_profile_1.py image:latest -P fio_profile_1.py -D '/dev/vdb2' -R 30

-P fio_profile_1.py卷中指定的 和文件名必须:/fio_profile_1.py具有相同的名称。


运行 python 文件的另一个解决方法是将其全部内容作为参数传递,如下所示:

docker run --rm image:latest -P "$(cat fio_profile_1.py)" -D '/dev/vdb2' -R 30

-P当您获得其内容的值时,fio_profile_1.py您可以使用如下方式运行该文件:

# Assuming the content of python is script is in `$2`:
printf "%s\n" "$2" | python

相关内容