使用Dockerfile将文件从容器复制到主机

13

我正在编写一个 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;"]

1
你尝试过使用 VOLUME <your_folder_inside> 吗?在构建后,运行 docker run -v <your_folder_inside>,然后你的主机目录为 /var/lib/docker/volumes/<your_folder_inside> - Alejandro Galera
3个回答

5

从容器中复制文件到主机在构建过程中可能不是一个好主意。你需要认真考虑你的使用情况。

然而,这是可以做到的,我将与您分享一种操作方法,因为这是展示我的Docker知识的机会,而不是因为我认为您应该这样做。有其他方法可以做到这一点。我的方法并不更好或更差,它们都是临时解决方案。

  1. 根据https://success.docker.com/article/how-do-i-enable-the-remote-api-for-dockerd中的说明修改您的dockerd配置。基本上只需添加-H tcp://0.0.0.0:2376。这是非常危险的步骤,因为它会使您暴露在网络上的任何人都可以入侵您的风险之中。虽然有身份验证等方式可以减轻此风险,但真正的最佳方法是不要这样做
  2. 修改您的Dockerfile:
    1. 在RUN块之前添加ARG DOCKER_HOST
    2. 在RUN块中:
      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 步骤中,您已获取了主机计算机的 root 权限,可以随意进行任何操作,包括写入任意文件。
这是一个愚蠢的想法,但它表明,由于可以从构建内部运行 Docker,因此您几乎可以在构建内部执行任何操作。如果您想要在构建内部运行图形界面应用程序,则可以实现。

1

在构建过程中没有特定的方法来实现这一点。在运行时,您可以通过挂载卷将文件复制出来,但在构建过程中不可用。如果您只是在运行时执行此操作,则可以执行类似于 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 runtime create failed: container_linux.go:348: starting container process caused "exec: "--": executable file not found in $PATH": unknown. ERRO[0002] error waiting for container: context canceled root@ionapp:/nginx# - Vetrivelkumar Pandi
你需要使用不同的挂载点,可能需要使用不同的命令(如其他地方提到的docker cp),如果cp二进制文件不可用。尝试使用/bin/cp - coderanger

1
没有支持在 docker build 过程中编写 Dockerfile 语句以修改主机上的文件。您应该记住,实际的镜像构建可能发生在另一个 Docker 引擎中,而不是您启动构建的引擎(Dockerfile 及其构建上下文被上传到 Docker 引擎)。
这里至少有两个选项:
1)编写一个 RUN 语句,使用 BUILD_ARG 访问另一台主机并在那里触发某些操作。我认为这是一种非常糟糕的 hack,因此我不想更具体地说明该语句可能是什么样子的。
2)在普通的 docker run 中执行所需的操作,您可以将主机目录挂载为容器的卷。
我还没有研究过 https://github.com/genuinetools/img 工具。它也旨在构建镜像,但在构建时可能提供更多可能性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接