Docker实战08|Docker管道及环境变量识别

11 篇文章 0 订阅

上一篇文章中,讲解了如何通过Go语言实现对Docker Cgroup的资源限制

具体文章可见《Docker就应该这么学-07》

有需要的小伙伴可以回顾一下。

接下来本文会详细介绍一下Docker 管道及环境变量识别

管道及环境变量识别

获取代码

git clone https://gitee.com/mjreams/docker.git

当在Linux上创建两个进程时,进程之间的通信一般就会使用管道的机制。所谓管道,就是一个连接两个进程的通道,它是Linux支持IPC的其中一种方式。一般来说,管道都是半双工的,一端进行写操作,另外一端进行读操作。

常用的管道分为两种类型。一种类型是无名管道,它一般用于具有亲缘关系的进程之间;另外一种是有名管道,或者叫FIFO管道,它是一种存在于文件系统的管道,可以被两个没有任何亲缘关系的进程进行访问。有名管道一般可以通过mkfifo()函数来创建。

从本质上来说,管道也是文件的一种,但是它和文件通信的区别在于,管道有一个固定大小的缓冲区,大小一般是4KB。当管道被写满时,写进程就会被阻塞,直到有读进程把管道的内容读出来。同样地,当读进程从管道内拿数据的时候,如果这时管道的内容是空的,那么读进程同样会被阻塞,一直等到有写进程向管道内写数据。

首先增加了一个函数,使用Go提供的pipe方法生成一个匿名管道。这个函数返回两个变量,一个是读一个是写,其类型都是文件类型。

container/container_process.go

这个方法的改动点己经表明,这里主要解决的问题是如何将创建的管道的一端传给子进程。这是一个文件类型,肯定不能通过字符参数的方式进行传递,因此使用了command的cmd.ExtraFiles方法。这个属性的意思是会外带着这个文件句柄去创建子进程。为什么叫“外带着”呢?因为1个进程默认会有3个文件描述符,分别是标准输入、标准输出、标准错误。这3个是子进程一创建的时候就会默认带着的,那么外带的这个文件描述符理所当然地就成为了第4个。


这里可以看到默认的文件描述符。通过这种方式,就把管道的一端传给子进程了。下面来看子进程的改动。

container/init.go


这里得到父进程传递过来的管道一端后,就直接去读,由于此时父进程可能还没写入,所以此时的读操作就会停在这里等待输入。然后,看一下最终的init方法做了什么。


可以看到,init进程读取了父进程传递过来的参数后,在子进程内进行了执行,这样就完成了将用户指定命令传递给子进程的操作。

最后,来看一下父进程是在哪里发送的参数。

run.go Run()

	//发送用户命令
	sendInitCommand(comArray, writePipe)

在父进程中,当进程start完毕后才发送参数,也就是说,子进程这时应该己经在读等待了。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Docker环境变量是在Docker容器中设置的变量。这些变量可以在容器内部使用,也可以在Dockerfile或docker-compose.yml文件中设置。以下是一些关于Docker环境变量的常见问题和答案: 1. 如何在Dockerfile中设置环境变量? 在Dockerfile中,您可以使用ENV指令设置环境变量。例如: ``` ENV MY_VAR=my_value ``` 2. 如何在docker-compose.yml文件中设置环境变量? 在docker-compose.yml文件中,您可以使用environment关键字设置环境变量。例如: ``` services: my_service: image: my_image environment: MY_VAR: my_value ``` 3. 如何在容器内部使用环境变量? 在容器内部,您可以使用$符号和变量名来引用环境变量。例如: ``` echo $MY_VAR ``` 4. 如何在运行容器时设置环境变量? 使用-e选项在运行容器时设置环境变量。例如: ``` docker run -e MY_VAR=my_value my_image ``` 5. 如何查看容器中的环境变量? 使用docker exec命令进入容器,并使用env命令查看环境变量。例如: ``` docker exec -it my_container bash env ``` ### 回答2: Docker环境变量是在容器内部运行时可以使用的变量。它们是在创建和运行容器时设置的,用于配置容器的各种参数和选项。 首先,环境变量可以用来指定容器应该使用的镜像版本。通过设置`IMAGE_VERSION`环境变量为特定的版本号,可以确保容器使用正确的镜像版本。 其次,环境变量可以用于配置容器的运行参数。例如,可以设置`PORT`环境变量为容器内部应用程序监听的端口号,使得容器可以通过该端口与外部通信。 此外,环境变量还可以用于传递应用程序所需的其他配置信息。例如,可以设置`DB_USERNAME`和`DB_PASSWORD`环境变量,以指定容器连接数据库时所需的用户名和密码。 使用环境变量可以提高容器的可移植性和灵活性。通过修改环境变量的值,可以在容器之间轻松切换所使用的配置,而不需要对应用程序的源代码进行修改。此外,环境变量也使得容器的配置变得可配置化,便于在不同的环境中部署相同的容器。 要在Docker容器中使用环境变量,可以在Dockerfile中使用`ENV`关键字来定义环境变量,或者在运行容器时使用`-e`选项来设置环境变量的值。 总而言之,Docker环境变量是一种非常实用的配置机制,可以灵活地配置容器的参数和选项,提高容器的可移植性和可配置性。 ### 回答3: Docker环境变量是一种在Docker容器内定义和使用的变量。它们可以用来配置容器的特定行为,也可以在容器之间共享信息。下面是关于Docker环境变量的一些重要信息。 首先,Docker环境变量可以在构建镜像时定义,也可以在启动容器时传递。当我们在构建镜像时定义环境变量时,它们将被固定在镜像中,以供容器在运行时使用。这样可以确保在每个容器实例中环境变量的一致性。 其次,Docker环境变量可以用于配置容器的一些重要参数。例如,我们可以使用环境变量指定数据库的连接字符串、设置服务器的IP地址和端口号,或指定应用程序的日志级别等。这样,我们可以通过修改环境变量的值,而无需重新构建和部署镜像,来调整容器的行为。 此外,Docker环境变量可以在不同容器之间传递信息。例如,我们可以在一个容器中定义一个环境变量,并将其传递给另一个容器,以便共享某些重要数据。这种方式可以帮助我们实现容器间的数据交流和协同工作。 最后,Docker环境变量也具有一定程度的安全性。我们可以通过将敏感信息(如密码和API密钥)存储为环境变量,而不是直接硬编码在容器中,来提高应用程序的安全性。这样,我们可以更好地保护这些敏感信息,避免它们意外泄漏。 总之,Docker环境变量是在Docker容器中定义和使用的变量,用于配置容器行为、共享信息和提高应用程序的安全性。它们提供了一种灵活和方便的方式来管理容器的特定需求和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值