【问题标题】:Copy files from Container to host using Dockerfile使用 Dockerfile 将文件从容器复制到主机
【发布时间】:2018-11-22 19:04:23
【问题描述】:

我正在编写一个 Docker 文件,我的要求是将容器内文件夹的内容复制到本地主机。我怎样才能做到这一点?

FROM ubuntu

RUN apt-get update && apt-get install -y apache2 && apt-get  install nginx  -y


#COPY resources   /var/www/html/

#VOLUME /var/www/html:/var/www/html

COPY /var/www/html/ /var/www/html/
CMD ["nginx", "-g", "daemon off;"]

【问题讨论】:

  • 在构建docker run -v <your_folder_inside>, and after that your host dir /var/lib/docker/volumes/`之后,您是否尝试过使用VOLUME <your_folder_inside>

标签: docker dockerfile


【解决方案1】:

在构建期间将文件从容器复制到主机可能是个坏主意。您应该认真考虑您的用例。

但是,这是可以做到的,我将与您分享一个过程,因为这是我展示我的 Docker 知识的机会——而不是因为我认为您应该这样做。还有其他方法可以做到这一点。我的方式没有好坏之分——它们都是杂牌。

  1. 按照https://success.docker.com/article/how-do-i-enable-the-remote-api-for-dockerd 中的说明修改您的 dockerd 配置。基本上加-H tcp://0.0.0.0:2376。这是一个非常危险的程序 b/c 它打开了您的网络,让您可以被网络上的任何人植根。有一些方法可以通过身份验证来降低这种风险,但实际上最好的方法是不要这样做
  2. 修改您的 Dockerfile:
    1. 在 RUN 块之前添加 ARG DOCKER_HOST
    2. 在运行块中:
      1. 安装 docker。
      2. 添加`export DOCKER_HOST=${DOCKER_HOST}。
      3. 添加docker container run --mount type=bind,source=/,destination=/srv/host alpine:3.4 ...
  3. 确定主机的 IP 地址。让我们假设它是 10.10.20.100。
  4. 通过添加 --build-arg DOCKER_HOST=10.10.20.100 来修改您的构建命令。

在步骤 2.2.3 中,您已将主机植根,您可以做任何您想做的事情 - 包括写入任何文件。

这是一个愚蠢的想法,但它表明,既然您可以在构建中运行 docker,那么在构建中确实没有什么是您不能做的。如果您想从构建中运行 gui 应用程序,您可以这样做。

【讨论】:

    【解决方案2】:

    在构建过程中没有特定的方法可以做到这一点。在运行时,您可以通过已安装的卷复制文件,但这在构建过程中不可用。如果您只是指在运行时,那么您可以执行docker run -v .:/out myimage -- cp -r /from/somewhere /out 或类似的操作。

    【讨论】:

    • 谢谢,我收到如下错误。我想将 :/var/www/html/ 的内容从容器复制到 :/var/www/html/ root@ionapp:~/nginx# docker run -v /var/www/html/:/var 的主机位置/www/html/ngnxvolume1 -- cp -r /var/www/html/ /var/www/html/ docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:348:启动容器进程导致“exec: \"--\": $PATH 中找不到可执行文件": 未知。 ERRO[0002] 错误等待容器:上下文取消 root@ionapp:~/nginx#
    • 如果cp 二进制文件不可用,您需要使用不同的挂载点,并且可能需要不同的命令(可能使用docker cp,如其他地方所述)。试试/bin/cp
    【解决方案3】:

    不支持在docker build 期间编写带有修改主机上文件的语句的 Dockerfile。您应该记住,实际的映像构建可能发生在另一个 Docker 引擎中,而不是您启动构建的那个引擎(Dockerfile 及其构建上下文被上传到 Docker 引擎)。

    这里至少有两个选项:

    1) 编写一个RUN 语句,该语句使用BUILD_ARG 与另一台主机联系并在那里触发一些操作。我认为这是一个非常糟糕的 hack,所以我不想更具体地说明该语句的外观。

    2) 以普通的docker run 执行所需的操作,您可以在其中将主机的目录作为卷挂载到容器中。

    我还没有研究过https://github.com/genuinetools/img 工具。它还旨在构建映像,但可能会在构建期间提供更多可能性。

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 2018-09-13
      • 2018-08-29
      • 2021-05-24
      • 2016-01-27
      • 1970-01-01
      • 2015-07-08
      • 2020-11-10
      相关资源
      最近更新 更多