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

Vet*_*ndi 9 docker dockerfile

我正在编写一个 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;"]
Run Code Online (Sandbox Code Playgroud)

emo*_*ory 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。这是一个非常危险的过程,因为它会让您被网络上的任何人获取 root 权限。有多种方法可以通过身份验证来减轻这种风险,但实际上最好的方法是不要这样做
  2. 修改你的 Dockerfile:
    1. ARG DOCKER_HOST在 RUN 块之前添加一个。
    2. 在运行块中:
      1. 安装泊坞窗。
      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,因此实际上没有什么是您不能在构建中执行的。如果您想从构建内部运行 GUI 应用程序,您可以这样做。