데이터베이스, 애플리케이션 서버 등을위한 하나의 Dockerfile이있을 때 프로젝트에 속하는 Dockerfile을 어떻게 구성합니까? 소스에서 일종의 계층 구조를 작성합니까? 대기업 프로젝트는 하나의 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 코드에서 구문 강조를 얻을 수 있습니다.
Dockerfile.web
실행 구성을 허용하지 않습니다 . 그래서 문제를 만들었습니다 : youtrack.jetbrains.com/issue/WEB-28185
docker-compose.yml
예를 들어 파일 내에 정의 된 각 '서비스'에 사용할 Dockerfile을 어떻게 지정 합니까?
docker-compose
및 여러Dockerfile
이름을 바꾸지 마십시오
Dockerfile
에Dockerfile.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
하여과 같은 디렉토리에 배치 할 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의 빠른 명령입니다 . 자세한 내용 은 공식 문서 를 참조하십시오.
COPY ../package.json /app/package.json
) 에 deps를 설치하기 위해 패키지 관리자 파일을 복사해야하는 경우 어떻게해야 합니까? 이 파일은 일반적으로 루트 수준에 있으며 도커는 부모에 대한 액세스를 금지했습니다. 어떤 접근법을 따를 것입니까?
web
에서 프로젝트 .
(의를 docker-compose.yml
: build: .
). 이런 식으로 web
빌드 할 때 루트 파일에 액세스 할 수 있습니다. 이 관련 질문을 보았습니다 : stackoverflow.com/questions/24537340/… 그리고 docker
명령 줄을 사용할 때 부모 디렉토리에서 대신 빌드 할 수 있으며이 답변은 docker-compose를 사용하여 수행하는 방법을 보여줍니다 : stackoverflow.com/a/45353241/ 1092815
-f
옵션은 괜찮지 만 docker-compose
하위 폴더와 함께 사용하는 것을 선호합니다 . 두 답변 모두 유효하다고 생각합니다. 대부분의 사람들은 기본 Dockerfile
이름 을 유지하여 대부분의 IDE를 즉시 지원할 수 있습니다. 나는 첫 번째 대답을 무효화하지 않고 대안을 제공하고 있습니다. IDE를 좋아하지 않아 Dockerfile을 php
사용할 때 파일 이라고 생각 Dockerfile.php
하지만 그렇습니다. docker documentation에서 몇 가지 예를 보았습니다. Dockerfile.build
, Dockerfile.debug
, 등
example.Dockerfile
VSCode에서 구문 강조 표시 및 아이콘을 유지하는 이름 지정 .
예를 들어, 추상화 레이어를 추가 한이 프로젝트에서 같은 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을 빌드합니다.