[docker] Docker : 프로젝트의 여러 Dockerfile

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



답변

저자 노트

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

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

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

원래 답변

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

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


답변

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

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

큰 저장.

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

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


답변

별도의 디렉토리에서 사용 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의 빠른 명령입니다 . 자세한 내용 은 공식 문서 를 참조하십시오.


답변

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


답변

예를 들어, 추상화 레이어를 추가 한이 프로젝트에서 같은 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을 생성 할 수 있습니다.


답변

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

app / db /

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


답변