2017-12-13 32 views
2

multiple dockerfiles (각 서비스마다 하나씩)을 사용하여 앱을 제작하고 있습니다. 다음과 같이 내 응용 프로그램의 디렉토리 구조는 다음과 같습니다에서Docker : 하위 디렉토리에 Dockerfile이있을 때 COPY 사용

app 
├── dockerfiles 
│ ├── webserver 
│ │ └── Dockerfile 
│ └── database 
│  └── Dockerfile 
├── public 
    └── <frontend> 
├── db 
    └── <data> 
    [...] 
├── LICENSE 
├── README.md 
└── docker-compose.yml 

내 웹 서버의 Dockerfile, 나는 COPY 명령을 사용하여 기존 코드를 복사 할 :

# Dockerfile 
COPY ./public /var/www/html 

을 그리고 내 docker-compose.yml를 사용하여 응용 프로그램을 배포 할 파일 : 나는 작업 디렉토리 (app)에서 docker-compose를 실행할 때

# docker-compose.yml 
version: "3" 
services: 
    webserver: 
     build: ./dockerfiles/webserver 
     image: webserver:php-apache 

, 나는 FO를 얻을 수 llowing 오류 : 내 웹 서버의 응용 프로그램의 루트에 Dockerfile, 그래서 그것이 경로에 의해 발생 또는 상황에 맞는 문제를 구축하고 있다고 알고 이동하는 경우

Building webserver 
Step 1/2 : FROM php:7.1.11-apache-jessie 
---> cb6a5015ad72 
Step 2/2 : COPY ./public /var/www/html 
Service 'webserver' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder193736188/public: no such file or directory 

이 오류가 사라집니다. (응용 프로그램의 루트) 전체 응용 프로그램에 대한

(1)를 사용하여 하나 Dockerfile, 또는

app 
└── Dockerfile 

:

그리고이를 알고, 우리는 하나가 문제 두 가지 방법 중 하나를 해결할 수 (2) 각 서비스 (앱의 루트에 있음)에 복수 Dockerfiles을 사용합니다.

app 
├── Dockerfile.webserver 
└── Dockerfile.database 

이 솔루션은 모든 것을 하나의 dockerfile/용기를 사용하여 best practice (1)하지 않기 때문에 나쁜,이 방식으로 구성 여러 dockerfiles있는 것은 단지 지저분한 외모 (2).


그래서, 내 질문은 :

우리가 어떻게 우리의 원래의 디렉토리 구조를 변경하지 않고이 문제를 해결합니까?

  • 어떤 변화가 기본 실행 명령에 docker-compose.yml 때문에, dockerfiles 제작하거나 할 필요가?
  • 모든 것을 구성하는 더 좋은 방법이 있습니까?
  • WORKDIR 명령은 어떻게됩니까?

이상적으로, 가장 좋은 방법은 COPY 명령의 범위는 폴더 어디 ...

답변

2

docker-compose.yml 파일의 빌드 섹션에 context: .dockerfile을 추가하면 서비스에서 전체 디렉토리 구조를 이해할 수 있습니다.

# docker-compose.yml 
version: "3" 
services: 
    webserver: 
    build: 
     context: . 
     dockerfile: ./dockerfiles/webserver/Dockerfile 
    image: webserver:php-apache 
+0

완벽하게 작동했습니다. 빌드 컨텍스트에서 문제가되어야한다는 것을 알았지 만 솔루션을 찾기가 너무 어려웠습니다. 가까운 장래에 이와 비슷한 상황에 도움이되기를 바랍니다. – CodyAE

0

을 DEV (로컬) 및 (원격) 생산 환경 모두 작동, 그래서 지금 볼륨을 피하도록해야 도커 파일입니다. 제 제안은 Dockerfile을 공용 폴더로 변경하고 지침을 COPY . /var/www/html으로 변경하는 것입니다.