热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Docker如何在不调用命令外壳的情况下运行命令?

如何解决《Docker如何在不调用命令外壳的情况下运行命令?》经验,为你挑选了1个好方法。

目前,我正在学习Docker,并阅读Dockerfile参考,特别是RUN指令。有两种形式-shell形式(RUN外壳中运行命令)和exec形式(“不调用命令外壳”)(从“ 注释”部分引用)。

如果我正确理解了文档,那么我的问题是-Docker是否以及如何在没有外壳的情况下运行命令?

请注意,是否可以在没有外壳的情况下执行命令?实际上并没有回答这个问题。

ffledgling.. 8

如果我正确理解了您的问题,那么您正在询问如何在不调用命令外壳的情况下运行某些东西(特别是在Docker上下文中)。

事情这样在内核通常使用在Linux上运行的exec系统调用的家庭。

例如,您将其传递到要运行的可执行文件的路径以及需要通过execl调用传递给它的参数。


无论如何,这实际上是您的shell(sh,bash,ksh,zsh)执行的操作。如果运行类似的命令,您可以自己观察strace -f bash -c "cat /tmp/foo"

在该命令的输出中,您将看到以下内容:

execve("/bin/cat", ["cat", "/tmp/foo"], [/* 66 vars */]) = 0

到底发生了什么的是bash的查找cat$PATH,它则认定,cat实际上是一个可执行的二进制提供/bin/cat。然后,它仅通过调用它execve。以及如上所示的正确参数。

您可以简单地编写一个执行相同功能的C程序。这样的程序看起来像这样:

#include

int main() {

    execl("/bin/cat", "/bin/cat", "/tmp/foo", (char *)NULL);

    return 0;
}

每种语言都提供了自己的与这些系统调用交互的方式。C做到了,Python做到了,而Go(也就是大多数情况下用来编写Docker的Go)也可以做到。当您点击时RUN,泊坞窗中的一条指令可能会转换为这些exec调用之一docker build。您可以运行strace -f docker build,然后grep用于exec在日志中调用,看看神奇的是如何发生的。


通过外壳运行与直接运行外壳之间的唯一区别是,您会失去外壳将为您完成的所有奇特的东西,例如变量扩展,可执行文件搜索等。



1> ffledgling..:

如果我正确理解了您的问题,那么您正在询问如何在不调用命令外壳的情况下运行某些东西(特别是在Docker上下文中)。

事情这样在内核通常使用在Linux上运行的exec系统调用的家庭。

例如,您将其传递到要运行的可执行文件的路径以及需要通过execl调用传递给它的参数。


无论如何,这实际上是您的shell(sh,bash,ksh,zsh)执行的操作。如果运行类似的命令,您可以自己观察strace -f bash -c "cat /tmp/foo"

在该命令的输出中,您将看到以下内容:

execve("/bin/cat", ["cat", "/tmp/foo"], [/* 66 vars */]) = 0

到底发生了什么的是bash的查找cat$PATH,它则认定,cat实际上是一个可执行的二进制提供/bin/cat。然后,它仅通过调用它execve。以及如上所示的正确参数。

您可以简单地编写一个执行相同功能的C程序。这样的程序看起来像这样:

#include

int main() {

    execl("/bin/cat", "/bin/cat", "/tmp/foo", (char *)NULL);

    return 0;
}

每种语言都提供了自己的与这些系统调用交互的方式。C做到了,Python做到了,而Go(也就是大多数情况下用来编写Docker的Go)也可以做到。当您点击时RUN,泊坞窗中的一条指令可能会转换为这些exec调用之一docker build。您可以运行strace -f docker build,然后grep用于exec在日志中调用,看看神奇的是如何发生的。


通过外壳运行与直接运行外壳之间的唯一区别是,您会失去外壳将为您完成的所有奇特的东西,例如变量扩展,可执行文件搜索等。


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 第四讲ApacheLAMP服务器基本配置Apache的编译安装从Apache的官方网站下载源码包:http:httpd.apache.orgdownload.cgi今 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了自动化测试专家Elfriede Dustin在2008年的文章中讨论了自动化测试项目失败的原因。同时,引用了IDT在2007年进行的一次软件自动化测试的研究调查结果,调查显示很多公司认为自动化测试很有用,但很少有公司成功实施。调查结果表明,缺乏资源是导致自动化测试失败的主要原因,其中37%的人认为缺乏时间。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
author-avatar
蒋雨儿_824
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有