使用 shell 脚本在 docker 容器中运行脚本

我正在尝试创建一个用于设置 docker 容器的 shell 脚本:

#!bin/bash


docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash

运行此脚本文件将在新调用的 bash 中运行容器。

现在我需要运行一个脚本文件(test.sh) ,它已经在上面给定的 shell 脚本的容器中了。(例如: cd/path/to/test.sh & & 。/test.sh) 怎么做?

382502 次浏览

可以使用 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]在正在运行的容器中运行命令:

docker exec mycontainer /path/to/test.sh

从一个 bash 会话中跑出来:

docker exec -it mycontainer /bin/bash

在那里你可以运行你的脚本。

假设您的 docker 容器已经启动并运行,您可以按以下方式运行命令:

docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"

也看看入口点。你将能够使用多个 CMD Https://docs.docker.com/engine/reference/builder/#/entrypoint

我正在为同一个问题寻找答案,并为我找到了 位于 Dockerfile 的 ENTRYPOINT解决方案。

文件夹

...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash

现在,在启动容器时执行脚本,并且在执行脚本之后获得 bash 提示符。

如果要在多个实例上运行相同的命令,可以这样做:

for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done

您还可以将本地目录挂载到 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中,我将脚本目录导出到路径。脚本目录现在包含多个文件,而不是一个。现在,我可以直接调用所有脚本,而不必在每次更改时打开子 shell。

顺便说一下,你也可以在容器外面定义历史文件。这样就不再需要提交 bash 更改了。

如果您不需要(或不需要)运行的容器,可以使用 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

这个命令对我很管用

cat local_file.sh | docker exec -i container_name bash

Thomio 的回答 是有帮助的,但它希望脚本存在于图像中。如果您有一个想要在容器内运行/测试的脚本(从命令行或在脚本中有用) ,那么您可以使用

$ docker run ubuntu:bionic /bin/bash -c '
echo "Hello there"
echo "this could be a long script"
'

这是旧的,我没有足够的声誉点来评论。尽管如此,我想还是值得分享一下如何将 Marvin 的想法推广到允许参数。

docker exec -i mycontainer bash -s arg1 arg2 arg3 < mylocal.sh