【问题标题】:How to creating Dockerfile with maven jdk and docker installed for jenkins pipeline如何使用为詹金斯管道安装的 maven jdk 和 docker 创建 Dockerfile
【发布时间】:2022-01-08 02:05:05
【问题描述】:

由于我在 dockerhub 上找不到具有 maven 3.8.1 的 docker 映像,打开 jdk 11 并安装了 docker,因此我尝试使用 Dockerfile 创建一个。我对此很陌生,因此面临问题。下面是我的 Dockerfile 的样子

FROM maven:3.8.1-adoptopenjdk-11
RUN apt update -y
RUN apt install -y curl
RUN curl https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz | tar xvz -C /tmp/ && mv /tmp/docker/docker /usr/bin/docker
RUN docker ps

当我执行docker build -t demo . 时,我得到以下错误日志

docker/docker-containerd
 38 27.1M   38 10.3M    0     0  18.5M      0  0:00:01 --:--:--  0:00:01 18.5Mdocker/docker-proxy
docker/docker-containerd-ctr
docker/dockerd
docker/docker-runc
100 27.1M  100 27.1M    0     0  19.7M      0  0:00:01  0:00:01 --:--:-- 19.7M
Removing intermediate container f4cd71aa05d2
 ---> 7b0055db2e58
Step 5/5 : RUN docker ps
 ---> Running in 83919a2985bf
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

我的目标是创建一个可用于 jenkins 管道的 Dockerfile,以构建一个 maven spring boot 项目 (mvn spring-boot:build-image)。有人可以指导我使用 Dockerfile 吗?

谢谢。

【问题讨论】:

  • 运行 docker-in-docker 时,您将主机 docker 套接字映射到容器中,以便它可以访问它。但这仅在运行容器时有效。我认为在构建期间没有任何方法可以像您尝试的那样访问它。
  • 当 jenkins 执行我的管道脚本时,我也可以在运行时执行此操作。基本上我需要为 jenkins 提供一个安装了 maven、jdk 11 和 docker 的 docker 镜像。如果我在运行时在 docker 中运行 docker,你能告诉我我的 Dockerfile 应该是什么样子吗? docker run 命令应该是什么样子?

标签: docker dockerfile docker-in-docker


【解决方案1】:

这是一个 Dockerfile,它将 docker-ce-cli 包安装在您用作基础的 Maven 映像上。您不需要docker-cecontainerd。安装命令取自 docker 网站。

FROM maven:3.8.1-adoptopenjdk-11
RUN apt update && \
    apt install -y ca-certificates curl gnupg lsb-release && \
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
    apt update && \
    apt install -y docker-ce-cli

然后,当您运行它时,您将主机上的 /var/run/docker.sock 映射到容器中的 /var/run/docker.sock,现在容器可以与主机上的 docker 守护进程通信。

这是我在 Windows 上运行它的方式。映射前面的 2 个斜线是由于 Windows 和 WSL2 的工作方式。在 Linux 主机上,您可以使用 -v /var/run/docker.sock:/var/run/docker.sock

C:\>docker build -t dind .    
C:\>docker run --rm -it --entrypoint /bin/bash -v "//var/run/docker.sock:/var/run/docker.sock" dind
root@d63b0fedd3e4:/# mvn --version
Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: /usr/share/maven
Java version: 11.0.11, vendor: AdoptOpenJDK, runtime: /opt/java/openjdk
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.72-microsoft-standard-wsl2", arch: "amd64", family: "unix"
root@d63b0fedd3e4:/# java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)
root@d63b0fedd3e4:/# docker --version
Docker version 20.10.11, build dea9396
root@d63b0fedd3e4:/# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
d63b0fedd3e4   dind      "/bin/bash"   19 seconds ago   Up 18 seconds             nifty_zhukovsky
root@d63b0fedd3e4:/#

我希望这可以帮助您入门,并且您可以添加所需的任何其他软件包的安装。

【讨论】:

  • 如果使用这个image,我们会得到相同的输出吗?下一个问题是如何合并这两个图像 - 这个和 maven:3.8.1-adoptopenjdk-11。这才是我真正苦苦挣扎的部分。
  • 是的,您也可以使用来自 docker hub 的 dind 图像。至于合并图像,我认为没有办法自己制作图像。您必须确定自己基于哪个镜像,然后创建一个 Dockerfile 来安装额外的软件包,以获得包含您需要的所有东西的镜像。
  • 这就是我尝试做的(参考我帖子中的原始 Dockerfile)但失败了
  • 如果你使用我制作的 Dockerfile 并将FROM ubuntu 替换为FROM maven:3.8.1-adoptopenjdk-11,你应该得到一个带有 Maven 和 Docker 的图像。你还需要更多吗? (我编辑了我的答案以使用 Maven 图像作为基础图像)
  • 由于它可以与 docker 守护进程通信并启动新容器,因此在容器中运行的任何内容都有效地在主机上具有 root 访问权限。有关更多信息,请参阅:docs.docker.com/engine/security/#docker-daemon-attack-surface
猜你喜欢
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多