使用shell脚本

时间:2015-07-23 04:57:08

标签: bash shell docker

我是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) 如何做到这一点,请随时询问情景是否不清楚。

8 个答案:

答案 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