【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

将 Docker 环境变量提升到新的高度:高级技巧和最佳实践 (将docker镜像打成tar包)

用户投稿2024-04-20热门资讯15

引言

Docker 环境变量是容器管理的重要组成部分。它们允许您配置容器运行时行为、传递敏感信息和动态调整应用程序设置。本文将深入探究 Docker 环境变量的更高级用途,提供最佳实践和提示,以帮助您充分利用它们。

将 Docker 镜像打成 TAR 包

Docker 镜像通常以文件系统层(layer)的形式存储,这可能导致空间浪费,尤其是在镜像包括大量公共层时。为了优化存储和传输,您可以将 Docker 镜像打成 TAR 包。以下是如何在 Linux 系统上执行此操作:```bashdocker savemy-image -o my-image.tar```生成的 TAR 包包含镜像的完整文件系统,可以方便地分发和加载到其他 Docker 主机。要从 TAR 包加载镜像,请使用以下命令:```bashdocker load --input my-image.tar```

使用环境变量文件

手动指定环境变量可能会变得乏味,尤其是在管理大量容器时。环境变量文件提供了一种方便的方法来集中管理和传递变量值。要创建环境变量文件,请使用以下语法:```textKEY1=value1KEY2=value2...```您可以在 Dockerfile 或 `docker run` 命令中使用 `--env-file` 标志引用该文件,如下所示:```dockerfileENV $(shell cat env.txt)``````bashdocker run --env-file env.txt my-image```

动态设置环境变量

有时,您可能需要在容器运行时动态设置环境变量。为此,您可以使用 `--env-vars` 标志将值传递给Docker daemon。以下命令将设置环境变量 `MY_VAR` 的值为 "dynamic-value":```bashdocker run --env-vars MY_VAR=dynamic-value my-image```您还可以在容器内使用 `export` 命令动态更新环境变量。

使用环境变量前缀

当管理大量环境变量时,使用前缀有助于组织和避免名称冲突。前缀将变量名称与特定模块或服务相关联。例如,以下命令使用 "APP_" 前缀设置 `APP_NAME` 和 `APP_VERSION` 变量:```dockerfileENV APP_NAME=my-appENV APP_VERSION=1.0```

最佳实践

使用有意义的名称:为环境变量选择描述性和简洁的名称,以提高可读性和维护性。保持安全:避免在环境变量中存储敏感信息,如密码或密钥。使用 Docker 密钥管理服务或其他安全机制来管理此类值。使用默认值:为可选或非必需的环境变量指定默认值,以确保一致性。记录变量:在文档中记录所有环境变量及其用法,以提高可追溯性和团队协作。使用版本控制:将环境变量文件和 Dockerfile 纳入版本控制,以跟踪更改和促进协作。

结论

掌握 Docker 环境变量的高级用法对于高效管理和配置容器至关重要。通过将镜像打包为 TAR 包、使用环境变量文件、动态设置变量和使用前缀,您可以充分利用这些功能。通过遵循最佳实践,您可以确保环境变量的安全性、可维护性和可扩展性。

超值一篇分享,Docker:从入门到实战过程全记录

作者 | 天元浪子

想要真正理解Docker,就不得不从虚拟化技术的发展历程说起。普遍认为虚拟化技术经历了物理机时代、虚拟机时代,目前已经进入到了容器化时代。可以说,Docker是虚拟化技术不断发展的必然结果。

那么,什么是容器呢?容器和虚拟机有什么不同?Docker和容器又是什么关系呢?搞明白这几个问题,Docker的概念就清晰了。

1.1 虚拟机和容器

借助于VMWare等软件,可以在一台计算机上创建多个虚拟机,每个虚拟机都拥有独立的操作系统,可以各自独立的运行程序。这种分身术虽然隔离度高(操作系统级),使用方便(类似物理机),但占用存储资源多(GB级)、启动速度慢(分钟级)的缺点也是显而易见的。

相较于虚拟机,容器(Container)是一种轻量型的虚拟化技术,它虚拟的是最简运行环境(类似于沙盒)而非操作系统,启动速度快(秒级)、占用存储资源少(KB级或MB级),容器间隔离度为进程级。在一台计算机上可以运行上千个容器,这是容器技术对虚拟机的碾压式优势。

1.2 容器、镜像和Docker

Docker是一个开源的应用容器引擎,可以创建容器以及基于容器运行的程序。Docker可以让开发者打包他们的应用和依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

听起来很简单,但是在Docker和容器之间,还隐藏着一个镜像的概念,令初学者颇感困惑。本质上,Docker镜像是一个特殊的文件系统,它提供容器运行时所需的程序、库、资源、配置等文件。Docker镜像类似于一个py文件,它需要Docker的运行时(类似于Python解释器)运行。镜像被运行时,即创建了一个镜像的实例,一个实例就是一个容器。

1.3 Docker 和 k8s

作为容器引擎,Docker为容器化的应用程序提供了开放的标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付、测试和部署代码。随着容器的大量使用,又产生了如何协调、调度和管理容器的问题,Docker的容器编排应运而生。

k8s是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理,是一个开源的,用于管理云平台中多个主机上的容器化的应用,k8s的目标是让部署容器化的应用简单并且高效,k8s提供了应用部署、规划、更新、维护的一种机制。

Docker和k8sr都是以containerd(容器化标准)作为运行时,因此使用Docker创建的镜像完全可以在k8s中无障碍的使用。

2.1 在ubuntu中安装

在linux系统中安装Docker非常简单,官方为我们提供了一键安装脚本。这个方法也适用于Debian或CentOS等发行版。

安装过程如果出现超时,不要灰心,多试几次,总会成功的。安装完成后,Docker只能被root用户使用,可以使用下面的命令取消权限限制:

然后,重启docker服务:

最后,关闭当前的命令行,重新打开新的命令行就可以了。

顺便提一下,如果在CentOS下安装,可能会出现一堆类似于下面的错误:

这是由于docker和Podman冲突造成的,需要先卸载Podman:

2.2 在Win10中安装

Docker的运行,依赖linux的环境,官方提供了Docker Desktop for Windows,但是它需要安装Hyper-V,Hyper-V是微软开发的虚拟机,类似于 VMWare 或 VirtualBox,仅适用于 Windows 10。这个虚拟机一旦启用,QEMU、VirtualBox 或 VMWare Workstation 15 及以下版本将无法使用!如果你必须在电脑上使用其他虚拟机(例如开发 Android 应用必须使用的模拟器),请不要使用 Hyper-V!

我的电脑是win10家庭版,不能直接安装hyper-v,需要将下面的命令保存到cmd文件中:

然后在cmd文件上点击右键,选择使用管理员运行。执行完毕后会重启,在重启的过程中进行安装。

2.3 Hello world

docker服务启动的情况下,运行下面的命令:

此命令的含义是:

第一次运行时,因为本地没有ubuntu:20.04镜像,docker会自动从镜像服务器下载。下载过程可能需要多试几次,只要成功一次,以后执行就不再需要下载了。

docker官方还提供了一个hello-world镜像,可以直接运行:

此命令省略了镜像版本和运行参数,docker使用latest作为版本,即最新版本。

从hello world的例子中,也可以体验到,docker实例的运行是非常快的。

docker官方的镜像库比较慢,在进行镜像操作之前,需要将镜像源设置为国内的站点。

新建文件/etc/docker/,输入如下内容:

然后重启docker的服务:

3.1 列出本地所有镜像

执行命令 docker images 可以查看

当前我本地只有刚才安装的两个镜像。

3.2 从镜像库中查找镜像

执行命令 docker search 镜像名称可以从docker镜像库中查找镜像。

最好选择官方(OFFICIAL)的镜像,这样的镜像最稳定一些。

3.3 下载新的镜像

执行命令docker pull 镜像名称:版本号即可下载新的镜像。

镜像下载后,就可以使用镜像来创建容器了。

将 Docker 环境变量提升到新的高度:高级技巧和最佳实践 (将docker镜像打成tar包) 第1张

4.1 启动容器

执行命令docker run即可启动容器,也就是创建某个镜像的实例。docker run命令非常复杂,可以先执行一个docker run --help来查看帮助:

比如我们要执行python的shell,需要添加-it参数,即:docker run -it python:3.8

4.2 将宿主机的文件挂载到容器

docker容器与宿主机是隔离的,要想让容器内的程序能访问宿主机上的文件,需要通过-v参数将宿主机的文件挂载到容器中。

比如我们在宿主机上有一个,可以打印hello,想要在python容器中执行,就需要进行挂载。-v后还需要接两个参数,分别是宿主机的目录和容器内的目录,两者使用:分隔,路径必须都是绝对路径。

我的保存在主目录的/docker_test目录中,将这个目录挂载到容器的/docker_test目录,然后在容器内执行python /docker_test/:

4.3 容器的端口映射

我们修改一下,创建一个socket服务端,并监听5000端口,当有客户端连接时,打印客户端的地址,先客户端发送hello,然后关闭连接:

在容器内执行:

接下来,尝试用telnet命令连接,结果却是失败的。原因是,127.0.0.1是宿主机的ip地址,5000是容器的端口,这与我们的习惯稍微有些不同。事实上,docker的容器是非常轻量的,它并没有自己的网络,要想访问容器的端口,需要进行端口映射,将容器的某端口映射到宿主机的端口,客户端连接时,只要与宿主机的端口进行连接就可以了。

需要注意的是,上面的代码创建的服务器,无论如何也不可能被客户端连接,因为代码中绑定了127.0.0.1的ip,在容器中运行时,需要绑定所有ip,即0.0.0.0。

然后,再使用-p参数,-p还需要三个参数,即宿主机的ip地址、宿主机的端口、容器的端口,三者之间使用:分隔。一般的,可以将宿主机的ip地址省略,只写宿主机的端口:容器的端口即可。

这样,就将容器的5000端口映射到了宿主机的5001端口,使用:

即可与容器中的服务器进行连接。

4.4 容器管理

上面的服务运行之后,可以使用docker ps命令,查看运行中的容器:

显示的内容有下面几列:

要想结束容器,可以使用docker kill 容器ID命令。

一般而言,当我们的程序开发完成后,会连同程序文件与运行环境一起制作成一个新的镜像。

要制作镜像,需要编写Dockerfile。DockeFile由多个命令组成,常用的命令有:

注意,Docker镜像中有一个层的概念,每执行一个RUN命令,就会创建一个层,层过多会导致镜像文件体积增大。尽量在RUN命令中使用&&连接多条shell命令,减少RUN命令的个数,可以有效减小镜像文件的体积。

5.1 自制显示文本文件内容镜像

编写,接收一个文件名,由python读取文件并显示文件的内容:

这个例子比较简单,缩写Dockerfile如下:

这个Dockerfile的含义是:

需要说明的是,ENTRYPOINT有两种写法:

这里采用第二种写法,是因为我们要在外部给容器传递参数。执行命令编译Docker镜像:

这个命令中,-t的含义是目标,即生成的镜像名为hello,版本号为1.0,别忘了最后那个.,这叫到上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

这样,我们的第一个镜像就制作完成了,使用下面的命令执行它:

即可看到~/docker_test/cat/files/的内容。

5.2 自制web服务器镜像

我们使用tornado开发一个网站,而python的官方镜像是没有tornado库的,这就需要在制作镜像时进行安装。

测试的如下:

编写Dockerfile文件如下:

在此我们验证一下CMD与ENTRYPOINT的区别。在Dockerfile所在有目录下执行如下命令:

执行完成后,再使用docker images使用就可以看到生成的镜像了,然后使用下面的命令运行:

在浏览器中输入宿主机的ip和8000端口,就可以看到页面了。

在这个例子中,我使用的运行命令是CMD,如果在docker run中指定的其他的命令,此命令就不会被执行,如:

此时,容器中被执行的是python命令,而不是我们的服务。在更多情况下,我们希望在docker run命令中为我们的服务传参,而不是覆盖执行命令,那么,我们应该使用ENTRYPOINT而不是CMD:

上面这种写法,是不支持传递参数的,ENTRYPOINT和CMD还支持另一种写法:

使用这种写法,docker run命令中的参数才可以传递给:

这个命令中,--port=9000被作为参数传递到中,因此容器内的端口就成了9000。

在生产环境中运行时,不会使用-it选项,而是使用-d选项,让容器在后台运行:

这种方式下,即使当前的控制台被关闭,该容器也不会停止。

5.3 自制apscheduler服务镜像

接下来,制作一个使用apscheduler编写的服务镜像,代码如下:

Dockerfile也是信手拈来:

生成镜像:

应该可以运行了,文件复制需要两个目录,在运行时,可以使用两次-v来挂载不同的目录:

前面用到的官方python镜像大小足足882MB,在这个基础上,再安装用到的第三方库,添加项目需要的图片等资源,大小很容易就超过1个G,这么大的镜像,网络传给客户非常的不方便,因此,减小镜像的体积是非常必要的工作。

docker hub上有个一python:3.8-alpine镜像,大小只有44.5MB。之所以小,是因为alpine是一个采用了busybox架构的操作系统,一般用于嵌入式应用。我尝试使用这个镜像,发现安装一般的库还好,但如果想安装numpy等就会困难重重,甚至网上都找不到解决方案。

还是很回到基本的路线上来,主流的操作系统镜像,ubuntu的大小为72.9MB,centos的大小为209MB——这也算是我更喜欢使用ubuntu的一个重要原因吧!使用ubuntu作为基础镜像,安装python后的大小为139MB,再安装pip后的大小一下子上升到了407MB,要是再安装点其他东西,很容易就赶上或超过python官方镜像的大小了。

看来,寻常路线是很难压缩镜像文件体积了。幸好,还有一条曲线救国的路可走,这就是多阶段构建法。

多阶段构建的思想其实很简单,先构建一个大而全的镜像,然后只把镜像中有用的部分拿出来,放在一个新的镜像里。在我们的场景下,pip只在构建镜像的过程中需要,而对运行我们的程序却一点用处也没有。我们只需要安装pip,再用pip安装第三方库,然后将第三方库从这个镜像中复制到一个只有python,没有pip的镜像中,这样,pip占用的268MB空间就可以被节省出来了。

1、在ubuntu镜像的基础上安装python:

然后运行:

这样,就生成了python:3.8-ubuntu镜像。

2、在python:3.8-ubuntu的基础上安装pip:

然后运行:

这样,就生成了python:3.8-ubuntu-pip镜像。

3、多阶段构建目标镜像:

这个dockerfile需要解释一下了,因为它有两个FROM命令。

第一个是以python:3.8-ubuntu-pip镜像为基础,安装numpy,当然,在实际应用中,把所有用到的第三方库出写在这里。

第二个FROM是以FROM python:3.8-ubuntu镜像为基础,将第三方库统统复制过来,COPY命令后的–from=0的意思是从第0阶段进行复制。实际应用中再从上下文中复制程序代码,添加需要的ENTRYPOINT等。

最后,再运行:

这然,用于我们项目的镜像就做好了。比使用官方python镜像构建的版本,小了大约750MB。

到此,我们的镜像已经制作好了,可是,镜像文件在哪,如何在生产环境下运行呢?

刚才使用docker images命令时,已经看到了生成的镜像:

我们可以使用docker save命令将镜像保存到指定的文件中,保存的文件是一个格式的压缩文件:

将复制到生产环境的机器上,然后执行导入命令:

就可以使用了。

Docker tar包和镜像、容器的转换

将容器导出成tar包: docker export 容器ID > tar包名称容器导出的tar包>镜像: docker import tar包名称 镜像名:版本镜像导出成tar包: docker save 镜像名:版本 > tar包名tar包导入: docker load -i tar包名称 个人觉得用镜像导出更好一点,用容器导出的tar包在import之后,需要用之前指定的cmd命令才能启动容器。

如何用Dockerfile创建镜像

创建镜像的目的首先说DockerHub或其它一些镜像仓库已经提供了够多的镜像,有最小版本,也有一些安装了mysql、nginx、apache等等第三方软件的版本可以直接拿来使用。 虽然已经足够多了,但是有些情况下并不能满足我们的需求,例如需要安装一些比较少用到的第三方软件,这个时候只能先用公共仓库中的镜像,启动容器,然后在容器中按照我们的需求安装软件,修改配置等等操作,之后提交镜像。 这些操作在之前的文章中介绍了。 这样操作完成之后,可以用如下两种方式实现定制镜像的目的:1.用save和export的方式将镜像保存为tar包,然后在需要的时候导入tar镜像包2.将已经配置好的镜像push到我们的私有仓库(docker创建私有仓库)或者已注册过的共有仓库中,需要的时候直接pull下来使用这两种方式都可以,但是自动化程度低、自由度不够、定制起来比较麻烦。 既然如此,那就来说一下更加自动化的创建方式。 Dockerfile结构dockerfile由4部分信息组成:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。 # This dockerfile uses the ubuntu image# VERSION 2 - EDITION 1# Author: docker_user# Command format: Instruction [arguments / command] .. # Base image to use, this must be set as the first lineFROM ubuntu # Maintainer: docker_user <docker_user at > (@docker_user)MAINTAINER docker_user docker_ # Commands to update the imageRUN echo debraring main universe >> /etc/apt/ apt-get update && apt-get install -y nginxRUN echo \ndaemon off; >> /etc/nginx/ # Commands when creating a new containerCMD /usr/sbin/nginx其中#表注释,可以标注一些说明性的文字。 FROM关键字指定镜像的来源,默认为DockerHub,也可以写私有仓库的镜像,例如:localhost:5000/centos:6.7,如果本地已经存在指定的镜像名称,则会从本地缓存直接获取。 MAINTAINER 指定镜像的作者,之后为镜像操作执行RUN、ADD等,最后是容器启动时发起的指令。 Dockerfile中的指令FROM: 指定镜像名称,格式为FROM <image> 或FROM <image>:<tag>,例如FROM ubuntu 或 FROM ubuntu:12.04 MAINTAINER: 镜像作者 ,格式为 MAINTAINER <name>RUN:格式为 RUN <command> 或 RUN [executable, param1, param2]。 前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。 指定使用其它终端可以通过第二种方式实现,例如 RUN [/bin/bash, -c, echo hello]。 每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。 当命令较长时可以使用 \ 来换行。 CMD:支持三种格式 [executable,param1,param2] 使用 exec 执行,推荐方式; command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用; [param1,param2] 提供给 ENTRYPOINT 的默认参数;指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。 如果指定了多条命令,只有最后一条会被执行。 如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。 EXPOSE:格式为 EXPOSE <port> [<port>...]。 告诉 Docker 服务端容器暴露的端口号,供互联系统使用。 在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。 ENV:格式为 ENV <key> <value>。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。 这就对应程序语言中的变量定义,可在需要的时候引用。 例如:1234 ENV PG_MAJOR 9.3ENV PG_VERSION 9.3.4RUN curl -SL$PG_ | tar -xJC /usr/src/postgress && …ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATHADD:格式为 ADD <src> <dest>。 该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。 COPY:格式为 COPY <src> <dest>。 复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>。 当使用本地目录为源目录时,推荐使用 COPY。 COPY和ADD的不同就是:ADD多了自动解压和支持URL路径的功能。 ENTRYPOINT:两种格式:ENTRYPOINT [executable, param1, param2]ENTRYPOINT command param1 param2(shell中执行)。 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。 CMD和ENTRYPOINT比较:两个命令都是只能使用一次,并且都是在执行docker run指令时运行,如果有多个,只执行最后一条。 两者的不同在于参数的传递方式,如果在Dockerfile中定义如下指令1 CMD echo hello或1 ENTRYPOINT [echo,hello] 那么在运行命令docker run containerId echo hello时,指定了CMD的输入结果为world,可以看出Dockerfile中指定的命令被覆盖了,而指定了ENTRYPOINT时,输出结果为hello echo world,可以看出指定的命令被作为ENTRYPOINT指定指令的参数了。 VOLUME:格式为 VOLUME [/data]。 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。 不过此属性在Dockerfile中指定并没有什么意义,因为没有办法指定本地主机的目录。 如果需要指定挂载点可以在执行docker run命令时指定:1 docker run -it -v /home/fengzheng/ftp/:/datad51c6d /bin/bashUSER:格式为 USER daemon。 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。 当服务不需要管理员权限时,可以通过该命令指定运行用户。 并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。 要临时获取管理员权限可以使用 gosu,而不推荐 sudo。 WORKDIR:格式为 WORKDIR /path/to/workdir。 为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。 可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。 例如1234 WORKDIR /aWORKDIR bWORKDIR cRUN pwd则最终路径为 /a/b/c。 ONBUILD:格式为 ONBUILD [INSTRUCTION]。 配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。 例如,Dockerfile 使用如下的内容创建了镜像 image-A。 1234 [...]ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build --dir /app/src[...]如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。 FROM image-A #Automatically run the followingADD . /app/srcRUN /usr/local/bin/python-build --dir /app/src使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。 基于CentOS6.7并源码安装nginx首先准备了安装包和(163源),将这两个文件放到同一目录下,并在此目录下创建名称为Dockerfile的文件。 之后在此文件中实现源替换、nginx编译安装、及一些依赖包的安装,Dockerfile内容如下 # this is a test ubuntu 12.04 image dockerfile# Author:fengzheng # Base image,this must be set as the first line#localhost:5000/centos:6.7是我的私有仓库的镜像,可替换为centos:6.7(DockerHub中的镜像)FROM localhost:5000/centos:6.7 MAINTAINER fengzheng # Commands to update the image RUN mkdir /usr/nginx1.9.9ADD /usr/nginx1.9.9/#RUN yum -y install tar#RUN tar -zxvf /usr/nginx1.9.9/ cd /etc/.d/ && mv /etc/.d/RUN cd /etc/.d/ && mv \&& yum clean all && yum makecache \&& yum -y install gcc \&& yum -y install yum install -y pcre-devel \&& yum -y install zlib zlib-devel \&& yum -y install openssl openssl--devel \&& cd /usr/nginx1.9.9/nginx-1.9.9/ && ./configure && make && make install #如果设置daemon off; nginx无法启动#RUN echo \ndaemon off; >> /etc/nginx/ # Commands when creating a new container# 启动nginx 需进入/usr/local/nginx/sbin 执行./configureCMD /bin/bash最后执行命令docker build -t nginx-centos:6.7 .其中.表示在当前目录下搜索Dockerfile文件,-t参数指定镜像名称和tag。

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

将 Docker 环境变量提升到新的高度:高级技巧和最佳实践 (将docker镜像打成tar包) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
欢迎你第一次访问网站!