Docker镜像构建上下文

来自docker技术入门与实践啦

Docker不是虚拟机,容器就是进程;这就是说容器中的应用都应该以前台执行,而不是虚拟机里面那样,用systemd去启动后台服务,容器中没有后台服务的概念;就是说如果用shell格式命令的话会将命令包装为sh -c的参数进行执行,例如

CMD service nginx start

这会导致容器执行后立即退出,而且容器内也不能用systemctl这样的命令,对于容器来说,启动程序就是容器应用程序,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,service nginx start这种命令是希望upstart来以后台守护进程形式启动nginx服务,在容器中这个命令就是sh -c service nginx start ,主进程是sh,那么service nginx start命令结束后,sh也就结束了,sh作为主进程退出了,那么容器自然退出;正确方式是直接执行nginx可执行文件,并且要求以前台形式执行,如

nginx -g daemon off

指令格式一般推荐exec格式,在解析时会被解析为JSON数组,因此一定要用“双引号而不是单引号;

在docker build 命令的最后一行,会有一个 .

比如

docker build -t nginx:v3 .

虽然这个 . 的确表示当前目录,但是并不是指定Dockerfile的所在路径,而是指定上下文路径context,理解这个context

首先要理解docker build的工作原理,Docker在运行时分为Docker引擎(服务端的守护进程啦)和客户端工具;

Docker的引擎提供了REST API,称为Docker Remote API,如docker命令这样的客户端工具,就是通过这组API与Docker引擎

交互从而完成各种功能,表面上在本地执行的各种docker功能都是使用的远程调用形式在服务端(docker引擎)完成,这种

c/s设计,能够让我们轻易的远程操控远程服务器的Docker引擎;

所以啦,docker build命令构建镜像,其实并非在本地,而是在服务端,即Docker引擎中构建的;

在这种c/s服务架构中,用上下文context来让服务端获得本地文件,

构建的时候,用户指定构建镜像上下文的路径,docker build命令得知这个路径后,会将路径下的所有内容打包,然后上传到docker引擎,服务端的docker引擎收到上下文包后,打开就会得到构建镜像所需的一切文件,一把来说,应该将Dockerfile置于一个空目录下,或者项目根目录下,如果该目录下没有所需文件,那么应该把所需文件复制一份过来,可以用.dockerignore文件来提出不需要作为上下文传递给Docker引擎的;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Java Docker API 构建 Docker 镜像,可以使用 `Dockerfile` 文件来定义构建步骤和镜像内容,然后使用 Docker Java 客户端提供的 `BuildImageCmd` 来构建镜像。以下是构建镜像的示例代码: ```java DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder().build(); DockerClient dockerClient = DockerClientBuilder.getInstance(config).build(); // 定义 Dockerfile 文件路径和构建上下文路径 String dockerfile = "/path/to/Dockerfile"; File buildContext = new File("/path/to/buildContext"); // 构建镜像 BuildImageResultCallback callback = new BuildImageResultCallback() { @Override public void onNext(BuildResponseItem item) { // 打印构建日志 System.out.println(item.getStream()); } }; dockerClient.buildImageCmd() .withDockerfile(new File(dockerfile)) .withBuildDirectory(buildContext) .exec(callback).awaitImageId(); ``` 在构建镜像时,需要指定 `Dockerfile` 文件路径和构建上下文路径。`Dockerfile` 文件用于定义构建步骤和镜像内容,构建上下文路径用于构建过程中需要的文件和目录。构建完成后,可以通过 `BuildImageResultCallback` 的 `awaitImageId()` 方法获取镜像 ID。 检查镜像是否构建成功,可以使用 `listImagesCmd` 方法获取当前主机上的所有镜像,然后查找构建镜像是否在列表中。以下是检查镜像是否构建成功的示例代码: ```java List<Image> images = dockerClient.listImagesCmd().exec(); for (Image image : images) { for (String tag : image.getRepoTags()) { if (tag.equals("image-name:tag")) { System.out.println("镜像构建成功!镜像 ID:" + image.getId()); return; } } } System.out.println("镜像构建失败!"); ``` 在 `listImagesCmd` 方法返回的镜像列表中,每个镜像都有一个或多个标签,可以通过标签来识别镜像。找到构建镜像后,可以获取其 ID 并打印出来,表示镜像构建成功。如果找不到构建镜像,则表示构建失败。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值