Docker 이미지를 실행할 때 쉘 매개변수를 전달하는 방법은 무엇입니까?

Docker 이미지를 실행할 때 쉘 매개변수를 전달하는 방법은 무엇입니까?

다음 매개변수를 허용하는 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

관련 정보