Docker : 상위 디렉토리에서 파일 추가


186

내 안에 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

누군가 왜 그리고 어떻게 올바르게해야하는지 알고 있습니까?


답변:


225

부모 디렉토리에서 Dockerfile을 빌드 할 수 있습니다.

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

3
감사합니다! 이것은 로컬 박스에서 잘 작동하지만 Docker Hub는 동일한 디렉토리 (tbh, 보통 예상되는 것)에서 이미지를 만들려고 시도하므로 이미지를 빌드하지 못합니다. Docker Hub에서 동일한 트릭을 수행 할 수있는 방법이 있습니까?
Marcel Hernandez

내가 아는 한에서는 아니다. 자동화 된 빌드를 사용하는 대신 이미지를 레지스트리로 푸시 할 수 있습니다.
Boedy

2
@ eduncan911 내 의견을 쓸 때 이것이 더 이상 사용되지 않는다고 생각하지 않습니다. 그때부터 마음이 바뀌었을까요? 내가 틀렸다면 더 이상 사용되지 않는다고 문서에 링크 할 수 있습니까? 감사!
omninonsense

6
-f docs- > Dockerfile 지정 (-f) : docs.docker.com/engine/reference/commandline/build/…
Ray

6
@ eduncan911 댓글이 더 이상 사용되지 않으므로 댓글을 삭제할 수 있습니까? 귀하의 의견 때문에 처음 에이 답변을 건너 뛰었습니다.
Chris Anderson

103

불행히도 (실제 및 보안상의 이유로 로컬 콘텐츠를 추가 / 복사하려는 경우)와 동일한 루트 경로에 있어야합니다 Dockerfile.

에서 문서 :

<src> 경로는 빌드 컨텍스트 내에 있어야합니다. 도커 빌드의 첫 번째 단계는 컨텍스트 디렉토리 (및 서브 디렉토리)를 도커 디먼에 전송하는 것이므로 ../something / something을 추가수 없습니다 .

편집 : 이제 -fDockerfile의 경로를 설정 하는 옵션 ( )이 있습니다. 원하는 것을 달성하는 데 사용할 수 있습니다. @Boedy의 답변을 참조하십시오.


22
이에 대한 "깨끗한"해결 방법이 있습니까? 오히려 이것을 수용하기 위해 전체 프로젝트 디렉토리를 재구성하지는 않을 것입니다.
ben_frankly

@ Günter가 말했듯이 여기에 해결 방법이 있습니다. superuser.com/a/842690/136024 ... 정말 "깨끗합니까?" 그럼 적어도 그것은 "해결 방법":)입니다
안토니 O.

2
@Boedy의 더 나은 답변보기 stackoverflow.com/a/34300129/2950621
nmgeek

103

docker-compose를 사용하면 컨텍스트 폴더를 설정할 수 있습니다.

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

9

허용 된 답변을 지원하기 위해 일부 코드 스 니펫 추가

디렉토리 구조 :

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

도커 파일 항목 :

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 build -t test:latest -f setup/docker/Dockerfile .

훌륭한 접근. 코드를 공유 할 수 install_x.sh있습니까?
Ariful Haque

4

composer를 사용하는 사람들을위한 해결책 은 상위 폴더를 가리키는 볼륨 을 사용하는 것입니다 .

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

그러나 Dockerfile에서 볼륨을 사용하여 재생할 수 있다고 확신합니다 .


3
할 수 없습니다. 참고 : 호스트 디렉토리는 특성상 호스트에 따라 다릅니다. 이러한 이유로 빌드 된 이미지는 이식 가능해야하므로 Dockerfile에서 호스트 디렉토리를 마운트 할 수 없습니다 . 모든 잠재적 호스트에서 호스트 디렉토리를 사용할 수있는 것은 아닙니다. docs.docker.com/engine/tutorials/dockervolumes/…
Peeter Kokk

4

-f다른 문제가 발생 했기 때문에 다른 솔루션을 개발했습니다.

  • 부모 폴더에 기본 이미지 만들기
  • 필요한 파일을 추가했습니다.
  • 이 이미지를 하위 폴더에있는 프로젝트의 기본 이미지로 사용했습니다.

-f플래그는 내 때문에 내 문제가 해결되지 않는 onbuild폴더에있는 파일에 대한 이미지 모양과 같은 전화를했다 :

-f foo/bar/Dockerfile foo/bar

대신에

-f foo/bar/Dockerfile .

또한 이것은 -f플래그 로 일부 경우에만 해결책입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.