Build docker image from a container

为了便于理解,这里我将尽量使用 手动 操作,而不是Dockerfile

先启动一个 ubuntu 容器

docker run -i -t --name base ubuntu /bin/bash

在此容器中安装 docker 并且 尝试执行 docker ps 会得到如下错误

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

原因其实很简单,因为容器内部存在 docker.sock ,那实际上最简单的在容器中build image的方法,就是mount 这个sock,然后容器会和宿主机共享同一个 docker.sock

docker run -i -t --name base2 -v /var/run/docker.sock:/var/run/docker.sock ubuntu /bin/bash

不过副作用是,因为使用了 宿主机的 sock,这里可以看到宿主机上运行的所有容器,并且实际上已经和宿主机在使用同一个docker环境了

新建一个 Dockerfile

FROM nginx
RUN echo 'hello dockerfile' > /usr/share/nginx/html/index.html

再次尝试build

error checking context: 'no permission to read from '/proc/1/mem''.

这是因为当前容器在创建的时候没有添加宿主机的 root 权限

添加 –privileged

docker run -i -t --name base3 --privileged -v /var/run/docker.sock:/var/run/docker.sock ubuntu /bin/bash

这里有一个小插曲,如果直接在 / 路径下使用 Dockerfile的话会得到一个错误

error checking context: ‘file (‘/proc/4427/fd/5′) not found or excluded by .dockerignore’.

解决办法是不要在 / 根路径下build

Send a Message