我是码头工人的新手。我必须调用一个shell脚本,它通过docker容器接受命令行参数。 示例:我的shell脚本看起来像:
#!bin/bash
echo $1
Dockerfile是这样的:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
我不确定在运行容器时如何传递参数
我是码头工人的新手。我必须调用一个shell脚本,它通过docker容器接受命令行参数。 示例:我的shell脚本看起来像:
#!bin/bash
echo $1
Dockerfile是这样的:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
我不确定在运行容器时如何传递参数
当前回答
在Docker中,传递这类信息的正确方法是通过环境变量。
因此,使用相同的Dockerfile,将脚本更改为
#!/bin/bash
echo $FOO
构建完成后,使用以下docker命令:
docker run -e FOO="hello world!" test
其他回答
我所拥有的是一个实际运行的脚本文件。这个票据文件可能相对复杂。让我们称它为“run_container”。这个脚本从命令行获取参数:
run_container p1 p2 p3
一个简单的run_container可能是:
#!/bin/bash
echo "argc = ${#*}"
echo "argv = ${*}"
我想做的是,在“dockering”之后,我希望能够用docker命令行上的参数启动这个容器,就像这样:
docker run image_name p1 p2 p3
并以p1 p2 p3作为参数运行run_container脚本。
这是我的解决方案:
Dockerfile:
FROM docker.io/ubuntu
ADD run_container /
ENTRYPOINT ["/bin/bash", "-c", "/run_container \"$@\"", "--"]
我想使用字符串版本的ENTRYPOINT,这样我就可以使用交互式shell。
FROM docker.io/ubuntu
...
ENTRYPOINT python -m server "$@"
然后运行命令(注意——):
docker run -it server -- --my_server_flag
它的工作方式是,字符串版本的ENTRYPOINT运行一个shell,并将命令指定为-c标志的值。在——之后传递给shell的参数作为“$@”所在命令的参数提供。参见表格:https://tldp.org/LDP/abs/html/options.html
(感谢@jkh和@BMitch帮助我了解发生了什么。)
在Docker中,传递这类信息的正确方法是通过环境变量。
因此,使用相同的Dockerfile,将脚本更改为
#!/bin/bash
echo $FOO
构建完成后,使用以下docker命令:
docker run -e FOO="hello world!" test
使用file.sh中的这个脚本
#!/bin/bash
echo Your container args are: "$@"
还有这个Dockerfile
FROM ubuntu:14.04
COPY ./file.sh /
ENTRYPOINT ["/file.sh"]
你应该能够:
% docker build -t test .
% docker run test hello world
Your container args are: hello world
如果你想@build time运行它:
CMD /bin/bash /file.sh arg1
如果你想运行它@运行时:
ENTRYPOINT ["/bin/bash"]
CMD ["/file.sh", "arg1"]
然后在主壳层
docker build -t test .
docker run -i -t test