如何在ubuntu14.04上从localhost将目录或文件复制到docker镜像?

时间:2014-10-24 10:32:57

标签: docker

当我通过Dockerfile将文件或目录添加到docker镜像时,我使用ADD或COPY,但我想要添加或复制的文件路径必须是Dockerfile目录的相对路径。是否有使用绝对路径将文件或目录从localhost添加到docker镜像的方法?顺便说一句,为什么“docker cp”只能支持将文件从docker镜像复制到localhost?相反,它不起作用?

5 个答案:

答案 0 :(得分:12)

简短的回答是不支持

来自Docker docs

  

< src> path必须在构建的上下文中;你不能添加 ../ something / something,,因为docker build的第一步是将上下文目录(和子目录)发送到docker守护进程。

此外,不支持符号链接,因此无法通过链接到本地​​主机上的其他位置来欺骗构建。

但是,支持 URL:s ,因此解决问题的一种方法是,如果在localhost(或docker容器)中启用Web服务器,则通过HTTP提供文件。

命令docker cp(不幸的是)仅支持从容器到主机,反之亦然。这在docs中有所描述。解决这个问题的方法是使用可以共享数据的docker volumes

答案 1 :(得分:2)

使用composer的人的解决方案是使用指向文件夹的volume

#docker-composer.yml

foo:
  build: foo
  volumes:
    - /local/path/:/path/:ro

但我很确定可以使用volumes in Dockerfile来完成。

答案 2 :(得分:0)

使用docker-compose时有一种解决方法:

api1:
  build: .
  dockerfile: cluster/manifests/Dockerfile-NodeAPI
  ports:
    - 8080
  links:
    - mongo
    - redis
  command: "nodemon lib/app.js -e js,json,scss,css,html"

这仍然不允许你做亲戚路径,但Dockerfile中的路径将是./而不是cluster/manifests/

答案 3 :(得分:0)

要复制文件,只需使用docker cp

docker cp file.txt CONTAINER:/path/to/dest

要复制目录,请使用tar管道:

tar -c "dir/" | docker run -i -a stdin CONTAINER tar -xC /path/to/dest

答案 4 :(得分:0)

对wassgren的回答进行了解释,你也可以使用码头工SDK来做到这一点。我不确定每个SDK,但至少docker-java将上下文作为输入流发送给docker。因此,您指定dockerClient.withBaseDirectory()dockerClient.withDockerFile()。您可以使用更多脚本方法并使用gradle或groovy来执行此操作,并避免每次都为此“编译”java。