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

zap*_*ppy 65 bash shell docker

我是Docker技术的新手,我正在尝试创建一个用于设置docker容器的shell脚本,我的脚本文件如下所示

#!bin/bash

docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

现在我需要运行一个脚本文件(test.sh),该文件已经在上面给出的shell脚本的容器内了.(例如:cd /path/to/test.sh&& ./test.sh)如何做到这一点,请随便问一下情景是否不清楚.

Jav*_*oso 88

您可以使用运行的容器运行一个命令docker exec [OPTIONS] CONTAINER COMMAND [ARG...]:

docker exec mycontainer /path/to/test.sh
Run Code Online (Sandbox Code Playgroud)

并从bash会话运行:

docker exec -it mycontainer /bin/bash
Run Code Online (Sandbox Code Playgroud)

从那里你可以运行你的脚本或其他任何东西.

  • 您也可以直接从主机运行本地脚本`docker exec -i mycontainer bash <mylocal.sh`这将读取本地主机脚本并在容器内运行它.你可以用其他东西(比如用管道传输到tar中的.tgz文件)来做这件事 - 它只是使用'-i'来管道进入容器进程std输入. (23认同)
  • 如果我需要首先进入/ bin/bash然后在bash中运行命令怎么办? (6认同)
  • 对我来说是:`docker exec -i containerID /bin/sh &lt; someLocalScript.sh` (4认同)
  • 我不是 powershell 专家(谢天谢地),但我四处闲逛并发现了 /sf/answers/825193281/。所以,也许 ```Get-Content mylocal.sh | docker exec -i mycontainer bash```。我不知道这是否有效。 (2认同)

Rag*_*ngh 79

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

docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案;您不必登录docker容器即可执行一个命令或一组命令。谢谢! (2认同)

小智 10

我正在寻找同一个问题的答案,并在我的Dockerfile解决方案中找到了ENTRYPOINT.

Dockerfile

...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash
Run Code Online (Sandbox Code Playgroud)

现在,当我启动容器时执行脚本,并在脚本执行后得到bash提示符.


小智 10

这个命令对我有用

cat local_file.sh | docker exec -i container_name bash
Run Code Online (Sandbox Code Playgroud)


Gan*_*ala 10

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

$ docker run ubuntu:bionic /bin/bash -c '
  echo "Hello there"
  echo "this could be a long script"
  '
Run Code Online (Sandbox Code Playgroud)


Dev*_*ool 6

您还可以将本地目录挂载到 docker 映像中,并在.bashrc. 不要忘记脚本必须由函数组成,除非您希望它在每个新 shell 上执行。(这是过时的,请参阅更新通知。)

我正在使用此解决方案来更新 docker 实例之外的脚本。这样我就不必在发生更改时重新运行图像,我只需打开一个新外壳。(摆脱了重新打开外壳 - 请参阅更新通知)

以下是绑定当前目录的方法:

docker run -it -v $PWD:/scripts $my_docker_build /bin/bash
Run Code Online (Sandbox Code Playgroud)

现在您的当前目录绑定到/scripts您的 docker 实例。

(过时)要保存.bashrc更改,请使用以下命令提交工作映像:

docker commit $container_id $my_docker_build
Run Code Online (Sandbox Code Playgroud)

更新

为了解决为每次更改打开一个新 shell 的问题,我现在执行以下操作:

在 dockerfile 本身中,我添加了RUN echo "/scripts/bashrc" > /root/.bashrc". 在里面,zshrc我将脚本目录导出到路径。脚本目录现在包含多个文件而不是一个。现在我可以直接调用所有脚本,而无需在每次更改时打开子 shell。

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

  • @zappy javier 的解决方案并没有为我方便地解决这个问题 - 但我的解决方案做到了,我认为对于那些有类似问题的人来说,他们不想重新启动 docker 镜像来更新一个查看他们需要的功能。例如,如果您一次使用多个 docker 镜像来启动开发集群,您不想一直重启它们。 (2认同)

Tho*_*mio 6

如果您不想要(或拥有)正在运行的容器,您可以直接使用该run命令调用您的脚本。

删除迭代 tty-i -t参数并使用:

    $ docker run ubuntu:bionic /bin/bash /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

这将(未测试)也适用于其他脚本:

    $ docker run ubuntu:bionic /usr/bin/python /path/to/script.py
Run Code Online (Sandbox Code Playgroud)