Docker : 프로젝트의 여러 Dockerfile


215

데이터베이스, 애플리케이션 서버 등을위한 하나의 Dockerfile이있을 때 프로젝트에 속하는 Dockerfile을 어떻게 구성합니까? 소스에서 일종의 계층 구조를 작성합니까? 대기업 프로젝트는 하나의 Dockerfile만으로 구성 할 수 없습니까?


15
허용 된 답변을 변경할 수 있습니다
pomber

3
"아웃 보트"하고 더 이상 사용되지 않는`Accepted '속성을보다 적절한 답변으로 자동 이동시키는 옵션이 있어야합니다. 이러한 이동에 대한 자격 기준은 1) 10 : 1의 투표 차이가 큼 2) 질문 작성자가 1 년 이상 로그인하지 않은 경우 (@LuckyLuke가 SO에서 4 년이 지난 것으로 보입니다) ago ...)
mirekphd

답변:


6

저자 노트

답변이 오래되었습니다. 그림이 더 이상 존재하지 않고 Docker compose 로 대체되었습니다 . 허용 된 답변을 삭제할 수 없습니다 ....

Docker Compose는 프로젝트 계층 구성을 지원합니다. 이제 각 하위 디렉토리에서 Dockerfile을 쉽게 지원할 수 있습니다.

├── docker-compose.yml
├── project1
│   └── Dockerfile
└── project2
    └── Dockerfile

원래 답변

각 구성 요소에 대한 Dockerfile을 포함하는 디렉토리를 만듭니다. 예:

컨테이너를 만들 때 디렉토리 이름을 지정하면 Docker가 올바른 Dockerfile을 선택합니다.


3
@DuncanJones 허용 된 답변을 삭제할 수 없습니다 원인 : 시도 :-)
Mark O'Connor

286

에서 (> = 1.8.0) 고정 표시기의 최신 버전 , 당신은이 작업을 수행 할 수 있습니다

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .

큰 저장.

편집 : raksja의 의견에 따라 버전을 업데이트

편집 : @vsevolod의 의견 : 파일 대신 .Dockerfile 확장자 (예 : Prod.Dockerfile, Test.Dockerfile 등)를 제공하여 VS 코드에서 구문 강조를 얻을 수 있습니다.


2
어떤 최신 버전입니까?
raksja


3
확실히 작동하지만 IDE에서 파일 이름을 인식하지 못하므로 구문 강조 표시를 수행하지 않습니다 :(
Alexander Mills

3
@AlexanderMills IDE WebStorm은 Dockerfile.web실행 구성을 허용하지 않습니다 . 그래서 문제를 만들었습니다 : youtrack.jetbrains.com/issue/WEB-28185
steampowered

5
docker-compose.yml예를 들어 파일 내에 정의 된 각 '서비스'에 사용할 Dockerfile을 어떻게 지정 합니까?
JoeTidee

127

별도의 디렉토리에서 사용 docker-compose및 여러Dockerfile

이름을 바꾸지 마십시오 DockerfileDockerfile.db또는 Dockerfile.web, 그것은 당신의 IDE에서 지원되지 않을 수 있습니다 당신은 구문 강조를 잃게됩니다.

으로 킹슬리 Uchnor 말했다 여러있을 수 있습니다Dockerfile , 빌드로 당신이 원하는 무언가를 표현 디렉토리에 하나씩.

docker각 응용 프로그램과 해당 구성을 보유 하는 폴더를 갖고 싶습니다 . 다음은 데이터베이스가있는 웹 응용 프로그램의 프로젝트 폴더 계층 구조 예입니다.

docker-compose.yml
docker
├── web
│   └── Dockerfile
└── db
    └── Dockerfile

docker-compose.yml 예:

version: '3'
services:
  web:
    # will build ./docker/web/Dockerfile
    build: ./docker/web
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  db:
    # will build ./docker/db/Dockerfile
    build: ./docker/db
    ports:
      - "3306:3306"
  redis:
    # will use docker hub's redis prebuilt image from here:
    # https://hub.docker.com/_/redis/
    image: "redis:alpine"

docker-compose 명령 줄 사용법 예 :

# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d

# get help
docker-compose --help

Dockerfile을 빌드 할 때 이전 폴더의 파일이 필요한 경우

위의 솔루션을 계속 사용 Dockerfile하여과 같은 디렉토리에 배치 할 docker/web/Dockerfile수 있습니다 context. 다음 docker-compose.yml과 같이 빌드를 설정하면됩니다 .

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
     - "5000:5000"
    volumes:
     - .:/code

이런 식으로 다음과 같은 것을 가질 수 있습니다.

config-on-root.ini
docker-compose.yml
docker
└── web
    ├── Dockerfile
    └── some-other-config.ini

그리고 ./docker/web/Dockerfile이와 같이 :

FROM alpine:latest

COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /

다음은 tldr docker-compose의 빠른 명령입니다 . 자세한 내용 은 공식 문서 를 참조하십시오.


1
빌드 시간 (fi COPY ../package.json /app/package.json) 에 deps를 설치하기 위해 패키지 관리자 파일을 복사해야하는 경우 어떻게해야 합니까? 이 파일은 일반적으로 루트 수준에 있으며 도커는 부모에 대한 액세스를 금지했습니다. 어떤 접근법을 따를 것입니까?
nass600

1
나도 그 한계를 공격했고이 예외, 나는 빌드 web에서 프로젝트 . (의를 docker-compose.yml: build: .). 이런 식으로 web빌드 할 때 루트 파일에 액세스 할 수 있습니다. 이 관련 질문을 보았습니다 : stackoverflow.com/questions/24537340/… 그리고 docker명령 줄을 사용할 때 부모 디렉토리에서 대신 빌드 할 수 있으며이 답변은 docker-compose를 사용하여 수행하는 방법을 보여줍니다 : stackoverflow.com/a/45353241/ 1092815
GabLeRoux

1
이것은 docker가 아닌 IDE의 문제입니다. @Shuo가 정답입니다.
BentOnCoding

1
두 번째 대답은 1 살이지만 Docker의 설명서에서 직접 가져 오지 않았습니다. -f옵션은 괜찮지 만 docker-compose하위 폴더와 함께 사용하는 것을 선호합니다 . 두 답변 모두 유효하다고 생각합니다. 대부분의 사람들은 기본 Dockerfile이름 을 유지하여 대부분의 IDE를 즉시 지원할 수 있습니다. 나는 첫 번째 대답을 무효화하지 않고 대안을 제공하고 있습니다. IDE를 좋아하지 않아 Dockerfile을 php사용할 때 파일 이라고 생각 Dockerfile.php하지만 그렇습니다. docker documentation에서 몇 가지 예를 보았습니다. Dockerfile.build, Dockerfile.debug, 등
GabLeRoux

3
example.DockerfileVSCode에서 구문 강조 표시 및 아이콘을 유지하는 이름 지정 .
vmassuchetto

8

Intellij에서는 도커 파일 이름을 * .Dockerfile로 간단하게 변경하고 파일 형식 * .Dockerfile을 docker 구문에 연결했습니다.


1
이것을 시도하고 멋진 Docker 아이콘을 얻습니다.
Drumbeg

3

예를 들어, 추상화 레이어를 추가 한이 프로젝트에서 같은 YAML 파일 https://github.com/larytet/dockerfile-generator 처럼 보인다

centos7:
    base: centos:centos7
    packager: rpm
    install:
      - $build_essential_centos 
      - rpm-build
    run:
      - $get_release
    env:
      - $environment_vars

짧은 Python 스크립트 / make는 구성 파일에서 모든 Dockerfile을 생성 할 수 있습니다.


1

여러 도커 파일을 사용해야하는 프로젝트에서 작업 할 때는 각 도커 파일을 별도의 디렉토리에 작성하면됩니다. 예를 들어

app / db /

위의 각 디렉토리에는 dockerfile이 포함됩니다. 응용 프로그램을 빌드 할 때 docker는 모든 디렉토리를 검색하고 모든 dockerfile을 빌드합니다.

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