我是Docker技术的新手,我正在尝试创建一个用于设置docker容器的shell脚本,我的脚本文件如下所示
#!bin/bash
docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash
运行此脚本文件将在新调用的bash中运行容器。
现在我需要从上面给出的shell脚本中运行一个已经在容器内的脚本文件(test.sh)。(例如:cd /path/to/test.sh& amp;& ./test.sh) 如何做到这一点,请随时询问情景是否不清楚。
答案 0 :(得分:80)
您可以使用docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
:
docker exec mycontainer /path/to/test.sh
从bash会话开始运行:
docker exec -it mycontainer /bin/bash
从那里你可以运行你的脚本或其他任何东西。
答案 1 :(得分:74)
假设您的docker容器已启动并正在运行,您可以将命令运行为:
docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
答案 2 :(得分:9)
我正在寻找同一个问题的答案,并在我的Dockerfile解决方案中找到了ENTRYPOINT。
<强> Dockerfile 强>
...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash
现在我在启动容器时执行脚本,并在执行脚本后得到bash提示符。
答案 3 :(得分:4)
您还可以将本地目录安装到docker镜像中,并在.bashrc
中获取脚本。不要忘记脚本必须包含函数,除非您希望它在每个新shell上执行。 (这已过时,请参阅更新通知。)
我使用此解决方案能够更新docker实例之外的脚本。这样,如果发生变化,我不必重新运行图像,我只需打开一个新的shell。 (摆脱重新打开shell - 请参阅更新通知)
以下是绑定当前目录的方式:
docker run -it -v $PWD:/scripts $my_docker_build /bin/bash
现在您的当前目录已绑定到docker实例的/scripts
。
(已过期)
要保存.bashrc
更改,请使用以下命令提交工作图像:
docker commit $container_id $my_docker_build
要解决为每次更改打开新shell的问题,我现在执行以下操作:
在dockerfile本身中,我添加了RUN echo "/scripts/bashrc" > /root/.bashrc"
。在zshrc
内部,我将脚本目录导出到路径。 scripts目录现在包含多个文件而不是一个。现在我可以直接调用所有脚本而无需在每次更改时打开子shell。
顺便说一下,您也可以在容器外定义历史文件。这样就没有必要再进行bash更改了。
答案 4 :(得分:1)
也看看入口点。您将能够使用多个CMD https://docs.docker.com/engine/reference/builder/#/entrypoint
答案 5 :(得分:0)
如果要在多个实例上运行相同的命令,可以执行以下操作:
for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done
答案 6 :(得分:0)
如果您不想(或没有)一个正在运行的容器,则可以使用run
命令直接调用脚本。
删除迭代的tty -i -t
参数,并使用此参数:
$ docker run ubuntu:bionic /bin/bash /path/to/script.sh
这((未测试)也可以用于其他脚本:
$ docker run ubuntu:bionic /usr/bin/python /path/to/script.py
答案 7 :(得分:0)
这个命令对我有用
cat local_file.sh | docker exec -i container_name bash