【问题标题】:Install Docker using a Dockerfile使用 Dockerfile 安装 Docker
【发布时间】:2017-12-01 21:27:30
【问题描述】:

我有一个如下所示的 Dockerfile:

# Pull base image
FROM  openjdk:8

ENV SCALA_VERSION 2.12.2
ENV SBT_VERSION 0.13.15

# Scala expects this file
RUN touch /usr/lib/jvm/java-8-openjdk-amd64/release

# Install Scala
## Piping curl directly in tar
RUN \
  curl -fsL http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz | tar xfz - -C /root/ && \
  echo >> /root/.bashrc && \
  echo 'export PATH=~/scala-$SCALA_VERSION/bin:$PATH' >> /root/.bashrc

# Install sbt
RUN \
  curl -L -o sbt-$SBT_VERSION.deb http://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \
  dpkg -i sbt-$SBT_VERSION.deb && \
  rm sbt-$SBT_VERSION.deb && \
  apt-get update && \
  apt-get install sbt && \
  sbt sbtVersion

# Install Docker
RUN \
  # if we have older versions, let's get rid of them first
  apt-get install docker

# Define working directory
WORKDIR /root

我想做的是,我想将 Docker 安装到这个镜像中,并能够在其中运行 docker 命令。如何启动已安装的 docker 实例?

【问题讨论】:

标签: scala docker sbt docker-in-docker


【解决方案1】:

您可以只安装docker 客户端二进制文件并与容器和主机共享dockerd

这是一个例子Dockerfile

FROM  openjdk:8

# Install your dependencies
# ...

# Install curl
RUN apt-get update && apt-get install -y \
  curl \
  && rm -rf /var/lib/apt/lists/*

# Install docker client    
ENV DOCKER_CHANNEL stable
ENV DOCKER_VERSION 17.03.1-ce
ENV DOCKER_API_VERSION 1.27
RUN curl -fsSL "https://download.docker.com/linux/static/${DOCKER_CHANNEL}/x86_64/docker-${DOCKER_VERSION}.tgz" \
  | tar -xzC /usr/local/bin --strip=1 docker/docker

构建镜像:

$ docker build -t docker-client .

运行一个挂载/var/run/docker.sock的docker容器,然后就可以在容器中使用docker命令了:

$ docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker-client /bin/bash
root@c696b78206a8:/# docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 16:58:30 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 21:43:09 2017
 OS/Arch:      linux/amd64
 Experimental: false

注意,挂载docker.sock意味着容器被允许访问docker主机。请注意存在潜在的安全风险。

【讨论】:

  • 感谢您的回复!容器访问 docker 主机不是问题,因为它仅用于构建和运行测试。完成此操作后,我们将不会在 docker 中使用 docker!
【解决方案2】:

我建议你使用官方的“dind”镜像(docker in docker):https://hub.docker.com/_/docker/。但是你需要重写你的 Dockerfile。

FROM docker:dind-stable
# Install your stuff

并且,考虑到这一点:

虽然一般不推荐在 Docker 内部运行 Docker,但也有一些合法的用例,比如 Docker 本身的开发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2019-02-10
    • 2022-06-30
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多