avatar

麦兜的小站

MDO.INK

  • 首页
  • 随笔
  • 知识库
  • 归档
  • 动态
  • 标签
  • 关于
Home Docker容器执行宿主机脚本方式
文章

Docker容器执行宿主机脚本方式

Posted 2025-01-20 Updated 2025-01- 20
By power 已删除用户
3~4 min read

需求背景

如果要在docker容器中执行一个shell脚本,往往需要

docker cp ./test.sh container_name:/
docker exec container_name /test.sh` 

这样,先将脚本copy到容器中,然后运行

较为繁琐

优化方案

docker exec -i container_name sh -s -arg1 -arg2 <test.sh` 

如上表示在容器中执行宿主机当前路径下的test.sh脚本,并将-arg1 -arg2两个命令行参数传给test.sh

注意事项

  1. 注意执行docker exec时一定要有参数-i,否则脚本内容将不会被执行,原理见下

  2. 注意执行docker exec时不能有参数-t, 否则会报错the input device is not a TTY

  3. > 如果脚本不需要入参,去掉-s即可

原理解释

平时我们‘进入容器’需要执行如下命令

docker exec -it container_name sh` 

这表示进入容器的命名空间,并执行sh命令

其中-i表示打开标准输入(即0号文件描述符),并将将宿主机当前bash的标准输入继承到容器的sh进程

-t表示为容器中的sh进程打开一个tty设备,让进程有终端

接下来我们在命令行输入的所有命令都会被脚本解释器sh进行解释并执行

那么,再看看我们的命令

docker exec -i container_name sh <test.sh` 

它同样是在容器中执行sh程序,但进程的标准输入被重定向到了宿主机的test.sh文件

sh会一行一行将test.sh中的命令解释并执行,文件读取完成后程序退出

其实就相当于我们‘进入容器’,把test.sh的内容一行一行敲进去,然后exit退出

原理理解了,python等其他脚本语言也可通过一样的方式进行执行脚本透传

测试

docker run busybox --name busybox
echo 'ls $1' >test.sh
docker exec -i busybox sh -s /usr/bin < test.sh` 
知识库
License:  CC BY 4.0
Share

Further Reading

Jul 31, 2025

如何实现接口幂等性

通俗的说,用户在系统中有操作,不管重复多少次,都应该产生一样的效果或返回一样的结果的。 幂等性的概念 幂等(Idempotent)是一个数学与计算机学的概念,常见于抽象代数中。 f(n)=1^n//无...

Jul 19, 2025

10个npm工具包

有了npm之后,前端人员真的是过上好日子了。我们可以直接把别人写好的工具包拿来用,非常的方便。 1.day.js-轻量日期处理 npminstalldayjs importdayjsfrom'd...

Jul 17, 2025

How to set up PHP7.4 on MacOS.

Thisisallverywellandgood.Apartfromonesmallinsignificantthing… TheversionofPHPinuseiscurrently7.4. Th...

OLDER

基于Docker安装部署MinIO对象存储服务inIO是一个开源的分布式对象存储服务器,旨在实现高性能、高可用性和可扩展

NEWER

在Docker容器中实现调用宿主机命令行的操作

Recently Updated

  • 如何实现接口幂等性
  • 10个npm工具包
  • How to set up PHP7.4 on MacOS.
  • Automa:一键自动化,网页数据采集与工作流程优化专家Automa:解锁自动化
  • Mac 下用 brew 搭建 LNMP

Trending Tags

thinkphp clippings

Contents

©2025 麦兜的小站. Some rights reserved.

Using the Halo theme Chirpy