Docker:从父目录添加文件

Ant*_* O. 152 docker

在我,Dockerfile我有:

ADD ../../myapp.war /opt/tomcat7/webapps/
Run Code Online (Sandbox Code Playgroud)

该文件存在,因为ls ../../myapp.war返回正确的文件,但当我执行时,sudo docker build -t myapp .我有:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory
Run Code Online (Sandbox Code Playgroud)

有人知道为什么以及如何正确地做到这一点?

Boe*_*edy 184

您可以从父目录构建Dockerfile:

docker build -t <some tag> -f <dir/dir/Dockerfile> .
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为正确的答案 (6认同)
  • @ eduncan911所以现在不推荐使用这个约定:`docker build -f sub/Dockerfile .`(请注意将构建上下文设置为当前目录的点)?我在码头上的任何地方都找不到它已被弃用的地方.构建上下文是`.`,因此您可以访问`./`及其下的任何内容. (6认同)
  • `-f`*似乎不按文档弃用 - > _Specify一个Dockerfile(-f)_:https://docs.docker.com/engine/reference/commandline/build/#specify-a- dockerfile - ˚F (6认同)
  • @ eduncan911你可以删除你的评论,因为它显然没有被弃用吗?由于你的评论,我最初跳过了这个答案. (6认同)
  • 谢谢!这在本地方框上工作正常,但Docker Hub无法构建映像,因为它尝试从同一目录(tbh,正常人们通常期望的那样)执行此操作.在Docker Hub中有没有办法做同样的技巧? (3认同)
  • @ eduncan911我认为在撰写评论时不建议弃用。从那以后他们可能会改变主意?如果我写错了,可以链接到说明它已弃用的文档吗?谢谢! (2认同)

mba*_*emy 93

不幸的是,(出于实际和安全原因,我猜),如果要添加/复制本地内容,它必须位于与之相同的根路径下Dockerfile.

文档:

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

编辑:现在有一个选项(-f)来设置Dockerfile的路径; 它可以用来达到你想要的效果,请参阅@Boedy的回复nelow.

  • 这有一个"干净"的解决方法吗?我宁愿不重构我的整个项目目录只是为了适应这个. (19认同)
  • 我真的想听听任何“安全原因” (4认同)
  • 请参阅@Boedy的更好答案http://stackoverflow.com/a/34300129/2950621 (2认同)

小智 75

使用docker-compose,您可以设置上下文文件夹:

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile
Run Code Online (Sandbox Code Playgroud)

  • 请小心设置上下文的位置,因为大文件/文件夹会使进程挂起。您需要使用 .dockerignore 忽略它们,并更适当地将上下文设置为您真正需要的位置。 (5认同)
  • dockerfile 路径应该相对于新上下文还是相对于 docker compose 文件? (2认同)

gun*_*sus 11

由于-f引起了另一个问题,我开发了另一个解决方案。

  • 在父文件夹中创建基本图像
  • 添加了所需的文件。
  • 将此图像用作子文件夹中项目的基本图像。

-f标志没有解决我的问题,因为我的onbuild图像在文件夹中查找文件并且必须像这样调用:

-f foo/bar/Dockerfile foo/bar

代替

-f foo/bar/Dockerfile .

另请注意,这只是某些情况下作为-f标志的解决方案


lfa*_*oco 11

给出以下设置:

+ parent
    + service1
        - some_file.json
    + service2
        - Dockerfile
Run Code Online (Sandbox Code Playgroud)

如果您有一个 Dockerfileservice2并想some_file.json从中复制,您可以service2 目录中service1运行它:

docker build -t my_image ../ --file Dockerfile

这会将目标上下文设置为高一级。这里棘手的部分是目标 Dockerfile 是显式设置的(因为它不在目标上下文中)。

在 中service2/Dockerfile,您必须发出该COPY命令,就好像该文件位于上一级:

COPY service1/some_file.json /target/location/some_file.json

代替

COPY ../service1/some_file.json /target/location/some_file.json # will not work


Bin*_*ati 7

添加一些代码片段以支持接受的答案。

目录结构:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>
Run Code Online (Sandbox Code Playgroud)

Docker文件条目:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/
Run Code Online (Sandbox Code Playgroud)

用于构建Docker映像的命令

docker build -t test:latest -f setup/docker/Dockerfile .
Run Code Online (Sandbox Code Playgroud)


Tro*_*yen 7

让我们在 docker-compose.yml 的父文件夹中设置上下文:../../
例如:

app:
    build:
      context: ../../
      dockerfile: ./source/docker/dockerfile/Dockerfile
Run Code Online (Sandbox Code Playgroud)