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