【问题标题】:Using Docker Commands during Docker Build在 Docker 构建期间使用 Docker 命令
【发布时间】:2020-06-24 19:50:48
【问题描述】:

我知道,可以通过在here 中描述的套接字以及详细here 中描述的多阶段构建来在容器中运行 docker 命令

我的用例有点不同。我正在尝试为SCION 构建一个 Docker 容器,它本身使用 Docker。

“快速而肮脏”的解决方案可能是在容器启动时简单地运行./scion.sh topology,并传入 Docker 套接字,但这不是最有效的方法,因为该命令需要一些时间才能运行。

因此问题是,我可以在构建阶段运行 Docker 命令吗?

【问题讨论】:

    标签: docker build


    【解决方案1】:

    是的,你可以。

    以下示例将在构建阶段打印出主机上正在运行的容器。

    如果你的 docker daemon 已经在 2375 上接受 tcp 连接,那么这里是一个如何做的例子:

    docker build -t docker-test --network host - << EOF
    FROM docker:latest
    # if 0.0.0.0 doesn't work for you then replace it with host IP
    ARG DOCKER_HOST=tcp://0.0.0.0:2375
    RUN docker container ls
    EOF
    

    如果您的主机不接受 TCP 连接并且您不想启用它,那么您可以运行一个并行 SOCAT 容器,它将 2375 上的流量转发到 docker 套接字。以下是您的启动方式:

    docker run -d --rm \
     -v /var/run/docker.sock:/var/run/docker.sock \
    -p 127.0.0.1:2375:12345 \
    bobrik/socat TCP-LISTEN:12345,fork UNIX-CONNECT:/var/run/docker.sock
    

    检查容器是否启动,然后运行 ​​docker build 命令查看它是否工作。

    我在 MacOS 和 Linux 上对此进行了测试。

    更新

    基于 cmets,这里有一个更安全的解决方案:

    docker run -d --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --hostname socat \
    --name socat \
    bobrik/socat TCP-LISTEN:12345,fork UNIX-CONNECT:/var/run/docker.sock
    
    docker build -t docker-test --network container:socat - << EOF
    FROM docker:latest
    # if 0.0.0.0 doesn't work for you then replace it with host IP
    ARG DOCKER_HOST=tcp://socat:12345
    RUN docker container ls
    EOF
    

    这样您的构建过程将连接到不同的容器,而无需加入主机网络。

    【讨论】:

    • 这就像一个魅力!但是,对于我的用例,我需要 Ubuntu 18.04 作为基础映像(对于某些依赖项),而 docker 映像是在 alpine 上构建的。我可以简单地使用 ubuntu:18.04 基础映像并在其中安装 docker,我是否需要进行多阶段构建并从 docker 映像复制 docker 可执行文件,或者在这种情况下我需要如何继续?
    • 你只需要 docker 客户端,不需要别的。您可以简单地在 Ubuntu 中安装它,甚至只下载可执行文件并将其放在路径上。我使用了 docker 镜像,因为我不希望示例太大而错过重点。
    • 请记住,设置它会带来巨大的安全风险——任何可以运行任何docker 命令的人都可以轻松接管整个主机。我完全不建议启用对 Docker API 的网络访问,即使仅限于本地系统。
    • @DavidMaze 并没有完全错,感谢您挑战我寻找更好的方法。 Docker 构建是一个“明智”的过程,应该在受控、隔离的环境中执行。你应该知道你在 Dockerfile 中做什么,并且你应该信任基础镜像。至于docker 命令,我没有给它更多的权力,它已经拥有
    • 好点 @DavidMaze 在这种情况下它只会用于本地开发环境,但要注意一点!
    猜你喜欢
    • 2020-12-10
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2020-01-22
    • 2020-05-03
    • 2023-04-04
    • 2021-10-17
    • 2023-04-09
    相关资源
    最近更新 更多