Docker:从父目录添加文件

时间:2014-07-02 17:24:37

标签: docker

Dockerfile我得到了:

ADD ../../myapp.war /opt/tomcat7/webapps/

该文件存在,因为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

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

8 个答案:

答案 0 :(得分:147)

您可以从父目录构建Dockerfile:

docker build -t <some tag> -f <dir/dir/Dockerfile> .

答案 1 :(得分:87)

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

来自the documentation

  

&lt; src&gt; path必须在构建的上下文中;您   无法添加../something/something,因为码头工人的第一步   build是将上下文目录(和子目录)发送到   docker daemon。

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

答案 2 :(得分:58)

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

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile

答案 3 :(得分:5)

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

 Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python3 viz

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

答案 4 :(得分:4)

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

目录结构:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

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/

用于构建docker映像的命令

docker build -t test:latest -f setup/docker/Dockerfile .

答案 5 :(得分:2)

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

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

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

-f foo/bar/Dockerfile foo/bar

而不是

-f foo/bar/Dockerfile .

另请注意,对于某些情况,这只是-f标志

的解决方案

答案 6 :(得分:0)

如果您使用的是skaffold,请使用'context:'为每个映像dockerfile指定上下文位置-context:../../../

            apiVersion: skaffold/v2beta4
            kind: Config
            metadata:
                name: frontend
            build:
                artifacts:
                    - image: nginx-angular-ui
                      context: ../../../
                      sync:
                          # A local build will update dist and sync it to the container
                          manual:
                              - src: './dist/apps'
                                dest: '/usr/share/nginx/html'
                      docker:
                          dockerfile: ./tools/pipelines/dockerfile/nginx.dev.dockerfile
                    - image: webapi/image
                      context: ../../../../api/
                      docker:
                          dockerfile: ./dockerfile
            deploy:
                kubectl:
                    manifests:
                        - ./.k8s/*.yml

skaffold run -f ./skaffold.yaml

答案 7 :(得分:0)

  • build 来自上层目录的 img

  • 给图片命名

  • 启用适当的卷共享

  • 检查上面链接中关于如何启动容器的 Makefile ...

    docker build . -t proj-devops-img --no-cache --build-arg UID=$(shell id -u) --build-arg GID=$(shell id -g) -f src/docker/devops/Dockerfile