Docker 설정
Docker 설정 (Docker Setup)
이 Getting Started 섹션은 Docker 컨테이너를 사용해 (한 머신에서, 그러나 별도의 컨테이너들로) Flink 클러스터를 로컬로 설정하는 방법을 안내합니다. Docker는 인기 있는 컨테이너 런타임이며, Apache Flink의 공식 Docker 이미지가 Docker Hub에 있습니다. Docker 이미지를 사용해 Docker에서 Session 또는 Application 클러스터를 배포할 수 있습니다.
출처: 문서
본문
Docker는 인기 있는 컨테이너 런타임입니다. Apache Flink의 공식 Docker 이미지가 Docker Hub에 있습니다. Docker 이미지를 사용해 Docker에서 Session 또는 Application 클러스터를 배포할 수 있습니다. 이 페이지는 Docker와 Docker Compose에서 Flink를 설정하는 방법에 초점을 둡니다.
standalone Kubernetes나 native Kubernetes 같은 관리형 컨테이너화 환경으로의 배포는 별도의 페이지에서 설명합니다.
Docker에서 Session Cluster 시작하기
Flink Session 클러스터는 여러 작업을 실행하는 데 사용할 수 있습니다. 각 작업은 클러스터가 배포된 후에 제출되어야 합니다. Docker로 Flink Session 클러스터를 배포하려면 JobManager 컨테이너를 시작해야 합니다. 컨테이너 간 통신을 활성화하려면 먼저 필수 Flink 구성 속성을 설정하고 네트워크를 만듭니다.
$ FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager"
$ docker network create flink-network
그 다음 JobManager를 시작합니다.
$ docker run \
--rm \
--name=jobmanager \
--network flink-network \
--publish 8081:8081 \
--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
flink:2.3.0-scala_2.12 jobmanager
그리고 하나 이상의 TaskManager 컨테이너를 시작합니다.
$ docker run \
--rm \
--name=taskmanager \
--network flink-network \
--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
flink:2.3.0-scala_2.12 taskmanager
웹 인터페이스는 이제 localhost:8081에서 사용할 수 있습니다.
이제 다음과 같이 작업을 제출할 수 있습니다(로컬 Flink 배포가 있다고 가정).
$ ./bin/flink run ./examples/streaming/TopSpeedWindowing.jar
클러스터를 종료하려면 (CTRL-C로) JobManager와 TaskManager 프로세스를 종료하거나, docker ps로 식별하고 docker stop으로 컨테이너를 종료하세요.
배포 모드 (Deployment Modes)
Flink 이미지는 기본 구성과 표준 진입점 스크립트가 있는 일반 Flink 배포를 포함합니다. 진입점을 다음 모드로 실행할 수 있습니다.
이를 통해 어떤 컨테이너화 환경에서도 독립 실행형(standalone) 클러스터(Session 또는 Application Mode)를 배포할 수 있습니다. 예를 들면:
- 로컬 Docker 설정에서 수동으로,
- Kubernetes 클러스터에서,
- Docker Compose로,
참고로 네이티브 Kubernetes도 기본적으로 같은 이미지를 실행하며, 수동으로 할 필요가 없도록 TaskManager를 필요에 따라 배포합니다.
다음 장들에서는 다양한 목적을 위해 단일 Flink Docker 컨테이너를 시작하는 방법을 설명합니다.
Docker에서 Flink를 시작한 후 localhost:8081에서 Flink Web UI에 접근하거나 ./bin/flink run ./examples/streaming/TopSpeedWindowing.jar처럼 작업을 제출할 수 있습니다.
시스템 구성을 쉽게 하기 위해 Session Mode에서 Flink 배포에는 Docker Compose를 사용할 것을 권장합니다.
Application Mode
application mode의 고수준 직관은 배포 모드 개요를 참조하세요.
Flink Application 클러스터는 단일 작업을 실행하는 전용 클러스터입니다. 이 경우 작업과 함께 클러스터를 한 단계로 배포하므로, 추가 작업 제출이 필요하지 않습니다.
job 아티팩트는 컨테이너 내 Flink JVM 프로세스의 classpath에 포함되며 다음으로 구성됩니다.
- 보통 Session 클러스터에 제출하는 작업 jar와
- Flink에 포함되지 않은 다른 필요한 의존성 또는 리소스.
Docker로 단일 작업을 위한 클러스터를 배포하려면 다음을 해야 합니다.
- job 아티팩트를 모든 컨테이너의
/opt/flink/usrlib아래에 로컬로 사용할 수 있게 하거나,--jars인자로 jar 목록을 전달합니다. - Application 클러스터 모드에서 JobManager 컨테이너를 시작합니다.
- 필요한 수의 TaskManager 컨테이너를 시작합니다.
컨테이너에서 job 아티팩트를 사용 가능하게 만들려면 다음 중 하나를 할 수 있습니다.
아티팩트가 있는 볼륨을 마운트하거나 JobManager와 TaskManager를 시작할 때 /opt/flink/usrlib에 마운트합니다:
$ FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager"
$ docker network create flink-network
$ docker run \
--mount type=bind,src=/host/path/to/job/artifacts1,target=/opt/flink/usrlib/artifacts1 \
--mount type=bind,src=/host/path/to/job/artifacts2,target=/opt/flink/usrlib/artifacts2 \
--rm \
--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
--name=jobmanager \
--network flink-network \
flink:2.3.0-scala_2.12 standalone-job \
--job-classname com.job.ClassName \
[--job-id <job id>] \
[--fromSavepoint /path/to/savepoint [--allowNonRestoredState]] \
[job arguments]
$ docker run \
--mount type=bind,src=/host/path/to/job/artifacts1,target=/opt/flink/usrlib/artifacts1 \
--mount type=bind,src=/host/path/to/job/artifacts2,target=/opt/flink/usrlib/artifacts2 \
--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
flink:2.3.0-scala_2.12 taskmanager
또는 사용자 지정 Dockerfile을 작성해 Flink 이미지를 확장하고, 빌드해서 JobManager와 TaskManager를 시작하는 데 사용합니다:
FROM flink
ADD /host/path/to/job/artifacts/1 /opt/flink/usrlib/artifacts/1
ADD /host/path/to/job/artifacts/2 /opt/flink/usrlib/artifacts/2
$ docker build --tag flink_with_job_artifacts .
$ docker run \
flink_with_job_artifacts standalone-job \
--job-classname com.job.ClassName \
[--job-id <job id>] \
[--fromSavepoint /path/to/savepoint [--allowNonRestoredState]] \
[job arguments]
$ docker run flink_with_job_artifacts taskmanager
또는 JobManager를 시작할 때 jars 인자로 jar 경로를 전달합니다:
$ FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager"
$ docker network create flink-network
$ docker run \
--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
--env ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-2.3.0.jar \
--name=jobmanager \
--network flink-network \
flink:2.3.0-scala_2.12 standalone-job \
--job-classname com.job.ClassName \
--jars s3://my-bucket/my-flink-job.jar,s3://my-bucket/my-flink-udf.jar \
[--job-id <job id>] \
[--fromSavepoint /path/to/savepoint [--allowNonRestoredState]] \
[job arguments]
standalone-job 인자는 Application Mode에서 JobManager 컨테이너를 시작합니다.
JobManager 추가 명령줄 인자
클러스터 진입점에 다음 추가 명령줄 인자를 제공할 수 있습니다.
--job-classname <job class name>(선택): 실행할 작업의 클래스 이름. 기본적으로 Flink는 classpath에서 Main-Class 또는 program-class manifest 항목이 있는 JAR을 검색해 작업 클래스로 선택합니다. 이 명령줄 인자로 작업 클래스를 수동으로 설정하세요.이 인자는 classpath에 그러한 manifest 항목이 없거나 둘 이상인 경우 필요합니다.
--job-id <job id>(선택): 작업에 대한 Flink 작업 ID를 수동으로 설정 (기본값: 00000000000000000000000000000000)--fromSavepoint /path/to/savepoint(선택): savepoint에서 복원. savepoint에서 이어서 실행하려면 savepoint 경로도 전달해야 합니다./path/to/savepoint는 클러스터의 모든 Docker 컨테이너에서 접근 가능해야 합니다(예: DFS에 저장하거나 마운트된 볼륨에서, 또는 이미지에 추가).--allowNonRestoredState(선택): 손상된 savepoint 상태 건너뛰기. 추가로 이 인자를 지정하면 복원할 수 없는 savepoint 상태가 건너뛰도록 허용됩니다.--jars(선택): 쉼표로 구분된 작업 jar 및 추가 아티팩트의 경로. flink filesystem에 저장되거나 HTTP(S)로 다운로드되는 작업 아티팩트를 가리키도록 이 인자를 지정할 수 있습니다. Flink는 작업 배포 중에 이를 가져옵니다. (예:--jars s3://my-bucket/my-flink-job.jar,--jars s3://my-bucket/my-flink-job.jar,s3://my-bucket/my-flink-udf.jar).
사용자 작업 메인 클래스의 main 함수가 인자를 받으면 docker run 명령 끝에 인자를 전달할 수도 있습니다.
Session Mode
session mode의 고수준 직관은 배포 모드 개요를 참조하세요.
Session Mode의 로컬 배포는 위의 Getting Started 섹션에서 이미 설명했습니다.
Flink Docker 이미지 (Flink Docker Images)
이미지 호스팅 (Image Hosting)
Flink Docker 이미지에는 두 가지 배포 채널이 있습니다.
Docker가 검토하므로 Docker Hub의 공식 이미지를 사용할 것을 권장합니다. apache/flink의 이미지는 Docker의 검토 과정이 지연되는 경우를 대비해 제공됩니다.
flink:latest 이름의 이미지를 시작하면 Docker Hub에서 최신 이미지를 가져옵니다. apache/flink에 호스팅된 이미지를 사용하려면 flink를 apache/flink로 바꾸세요. (Flink 1.11.3부터 시작하는) 모든 이미지 태그는 apache/flink에서도 사용할 수 있습니다.
이미지 태그 (Image Tags)
Flink Docker 리포지토리는 Docker Hub에 호스팅되며 Flink 1.2.1 이상 버전의 이미지를 제공합니다. 이 이미지들의 소스는 Apache flink-docker 리포지토리에서 찾을 수 있습니다.
지원되는 각 Flink/Scala 버전 조합에 대한 이미지가 있으며, 편의를 위해 태그 별칭이 제공됩니다.
예를 들어 다음 별칭을 사용할 수 있습니다.
flink:latest→flink:<latest-flink>-scala_<latest-scala>flink:1.11→flink:1.11.<latest-flink-1.11>-scala_2.12
참고: 필요한 Flink와 Scala 버전을 모두 지정하는 docker 이미지의 명시적 버전 태그(예:
flink:1.11-scala_2.12)를 항상 사용할 것을 권장합니다. 이렇게 하면 애플리케이션에 사용되는 Flink 및/또는 Scala 버전이 docker 이미지가 제공하는 버전과 다를 때 발생할 수 있는 일부 클래스 충돌을 피할 수 있습니다.
참고: Flink 1.5 이전 버전에서는 Hadoop 의존성이 항상 Flink와 함께 번들되었습니다. 일부 태그가 Hadoop 버전을 포함하는 것을 볼 수 있습니다(예:
-hadoop28). Flink 1.5부터 Hadoop 버전을 생략한 이미지 태그는 번들된 Hadoop 배포를 포함하지 않는 Hadoop-free Flink 릴리스를 나타냅니다.
Flink와 Docker Compose (Flink with Docker Compose)
Docker Compose는 Docker 컨테이너 그룹을 로컬에서 실행하는 방법입니다. 다음 섹션들은 Flink를 실행하기 위한 구성 파일 예시를 보여줍니다.
일반 (General)
- docker-compose.yaml 파일을 만듭니다. 아래 섹션들의 예시를 확인하세요.
- 포그라운드에서 클러스터를 시작합니다(
-d는 백그라운드용).
$ docker compose up
- 클러스터를
N개 TaskManager로 확장하거나 축소합니다.
$ docker compose scale taskmanager=<N>
- JobManager 컨테이너에 접근합니다.
$ docker exec -it $(docker ps --filter name=jobmanager --format={{.ID}}) /bin/sh
- 클러스터를 종료합니다.
$ docker compose down
- Web UI 접근 클러스터가 실행 중일 때 http://localhost:8081에서 웹 UI를 방문할 수 있습니다.
Application Mode
application mode에서는 이미지에 번들된 Flink 작업만 실행하도록 전용된 Flink 클러스터를 시작합니다. 따라서 애플리케이션별 전용 Flink 이미지를 빌드해야 합니다. 자세한 내용은 여기를 확인하세요. jobmanager 서비스의 command에서 JobManager 인자를 지정하는 방법도 참조하세요.
Application Mode용 docker-compose.yml:
version: "2.2"
services:
jobmanager:
image: flink:2.3.0-scala_2.12
ports:
- "8081:8081"
command: standalone-job --job-classname com.job.ClassName [--job-id <job id>] [--jars /path/to/artifact1,/path/to/artifact2] [--fromSavepoint /path/to/savepoint] [--allowNonRestoredState] [job arguments]
volumes:
- /host/path/to/job/artifacts:/opt/flink/usrlib
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
parallelism.default: 2
taskmanager:
image: flink:2.3.0-scala_2.12
depends_on:
- jobmanager
command: taskmanager
scale: 1
volumes:
- /host/path/to/job/artifacts:/opt/flink/usrlib
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
taskmanager.numberOfTaskSlots: 2
parallelism.default: 2
Session Mode
Session Mode에서는 docker compose를 사용해 그 후 작업을 제출할 수 있는 장기 실행 Flink Cluster를 시작합니다.
Session Mode용 docker-compose.yml:
version: "2.2"
services:
jobmanager:
image: flink:2.3.0-scala_2.12
ports:
- "8081:8081"
command: jobmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
taskmanager:
image: flink:2.3.0-scala_2.12
depends_on:
- jobmanager
command: taskmanager
scale: 1
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
taskmanager.numberOfTaskSlots: 2
Session Cluster와 함께하는 Flink SQL Client
이 예시에서는 장기 실행 session cluster와 작업 제출에 이 클러스터를 사용하는 Flink SQL CLI를 시작합니다.
Session Cluster와 함께하는 Flink SQL Client용 docker-compose.yml:
version: "2.2"
services:
jobmanager:
image: flink:2.3.0-scala_2.12
ports:
- "8081:8081"
command: jobmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
taskmanager:
image: flink:2.3.0-scala_2.12
depends_on:
- jobmanager
command: taskmanager
scale: 1
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
taskmanager.numberOfTaskSlots: 2
sql-client:
image: flink:2.3.0-scala_2.12
command: bin/sql-client.sh
depends_on:
- jobmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
rest.address: jobmanager
- SQL Client를 시작하려면 다음을 실행합니다.
docker compose run sql-client
그 다음 테이블을 만들고 쿼리할 수 있습니다.
- 모든 필수 의존성(예: 커넥터용)이 클러스터와 클라이언트 모두에서 사용 가능해야 합니다. 예를 들어 SQL Kafka Connector를 추가하고 사용하려면 사용자 정의 이미지를 빌드해야 합니다.
kafka.Dockerfile이라는 Dockerfile을 다음과 같이 만듭니다.
FROM flink:2.3.0-scala_2.12
ARG kafka_connector_version=4.0.0-2.0
RUN wget -P /opt/flink/lib https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-kafka/$kafka_connector_version/flink-sql-connector-kafka-$kafka_connector_version.jar
- jobmanager, taskmanager, sql-client 서비스에 대해
image구성을 Dockerfile을 참조하는build명령으로 바꿉니다. 예를 들어 jobmanager 서비스는 다음 설정으로 시작됩니다.
jobmanager:
build:
dockerfile: ./kafka.Dockerfile
...
ADD JAR 같은 SQL 명령은 호스트 머신에 있는 JAR에는 동작하지 않습니다. 로컬 파일시스템에서만 동작하며, 이 경우 이것은 Docker의 overlay filesystem입니다.
Docker에서 Flink Python 사용하기 (Using Flink Python on Docker)
Python과 PyFlink가 준비된 사용자 정의 이미지를 빌드하려면 다음 Dockerfile을 참조할 수 있습니다.
FROM flink:2.3.0
# install python3 and pip3
RUN apt-get update -y && \
apt-get install -y python3 python3-pip python3-dev && rm -rf /var/lib/apt/lists/*
RUN ln -s /usr/bin/python3 /usr/bin/python
# install PyFlink
RUN pip3 install apache-flink==2.3.0
pyflink:latest라는 이름의 이미지를 빌드합니다.
$ docker build --tag pyflink:latest .
Docker에서 Flink 구성하기 (Configuring Flink on Docker)
동적 속성으로 (Via dynamic properties)
$ docker run flink:2.3.0-scala_2.12 \
<jobmanager|standalone-job|taskmanager|historyserver> \
-D jobmanager.rpc.address=host \
-D taskmanager.numberOfTaskSlots=3 \
-D blob.server.port=6124
동적 속성으로 설정된 옵션은 Flink 구성 파일의 옵션을 덮어씁니다.
환경 변수로 (Via Environment Variables)
Flink 이미지를 실행할 때 환경 변수 FLINK_PROPERTIES를 설정해 구성 옵션을 변경할 수도 있습니다.
$ FLINK_PROPERTIES="jobmanager.rpc.address: host
taskmanager.numberOfTaskSlots: 3
blob.server.port: 6124
"
$ docker run --env FLINK_PROPERTIES=${FLINK_PROPERTIES} flink:2.3.0-scala_2.12 <jobmanager|standalone-job|taskmanager>
jobmanager.rpc.address 옵션은 반드시 구성해야 하며, 나머지는 선택 사항입니다.
환경 변수 FLINK_PROPERTIES는 Flink 구성 파일에서와 같은 방식으로 새 줄로 구분된 Flink 클러스터 구성 옵션 목록을 포함해야 합니다. FLINK_PROPERTIES는 Flink 구성 파일의 구성보다 우선합니다.
Flink 구성 파일로 (Via Flink configuration file)
구성 파일(Flink 구성 파일, 로깅, 호스트 등)은 Flink 이미지의 /opt/flink/conf 디렉터리에 있습니다. Flink 구성 파일에 대한 사용자 정의 위치를 제공하려면 다음 중 하나를 할 수 있습니다.
사용자 정의 구성 파일이 있는 볼륨을 이 경로 /opt/flink/conf에 마운트합니다:
$ docker run \
--mount type=bind,src=/host/path/to/custom/conf,target=/opt/flink/conf \
flink:2.3.0-scala_2.12 <jobmanager|standalone-job|taskmanager>
또는 사용자 custom Flink image에 추가하고, 빌드해서 실행합니다:
FROM flink
ADD /host/path/to/config.yaml /opt/flink/conf/config.yaml
ADD /host/path/to/log4j.properties /opt/flink/conf/log4j.properties
마운트된 볼륨은 필요한 모든 구성 파일을 포함해야 합니다. Flink 구성 파일은 Docker 진입점 스크립트가 특정 경우에 수정할 수 있도록 쓰기 권한이 있어야 합니다.
파일시스템 플러그인 사용 (Using Filesystem Plugins)
plugins 문서 페이지에서 설명한 것처럼, 플러그인을 사용하려면 Docker 컨테이너의 Flink 설치에서 올바른 위치로 복사되어야 동작합니다.
Flink와 함께 제공되는 플러그인(Flink 배포의 opt/ 디렉터리)을 활성화하려면 Flink 이미지를 실행할 때 환경 변수 ENABLE_BUILT_IN_PLUGINS를 전달할 수 있습니다. ENABLE_BUILT_IN_PLUGINS는 ;로 구분된 플러그인 jar 파일 이름 목록을 포함해야 합니다. 유효한 플러그인 이름의 예는 flink-s3-fs-hadoop-2.3.0.jar입니다.
$ docker run \
--env ENABLE_BUILT_IN_PLUGINS=flink-plugin1.jar;flink-plugin2.jar \
flink:2.3.0-scala_2.12 <jobmanager|standalone-job|taskmanager>
Flink 이미지를 사용자 정의하는 더 고급 방법도 있습니다.
메모리 할당자 전환 (Switching the Memory Allocator)
Flink는 메모리 단편화 문제를 해결하기 위해 jemalloc을 기본 메모리 할당자로 도입했습니다(FLINK-19125 참조).
이전 동작을 복원하거나 예상치 못한 메모리 소비가 관찰된 경우(문제를 찾으면 JIRA나 메일링 리스트로 보고해 주세요) 환경 변수 DISABLE_JEMALLOC을 true로 설정해 메모리 할당자로 glibc를 다시 사용하도록 전환할 수 있습니다.
$ docker run \
--env DISABLE_JEMALLOC=true \
flink:2.3.0-scala_2.12 <jobmanager|standalone-job|taskmanager>
여전히 glibc 메모리 할당자를 사용하는 사용자의 경우, 특히 RocksDBStateBackend로 savepoint나 full checkout이 생성될 때 glibc 버그가 쉽게 재현될 수 있습니다. 환경 변수 MALLOC_ARENA_MAX를 설정하면 무제한 메모리 증가를 피할 수 있습니다.
$ docker run \
--env MALLOC_ARENA_MAX=1 \
flink:2.3.0-scala_2.12 <jobmanager|standalone-job|taskmanager>
추가 사용자 정의 (Further Customization)
Flink 이미지를 더 사용자 정의할 수 있는 여러 방법이 있습니다.
- 사용자 정의 소프트웨어 설치(예: python)
/opt/flink/opt의 선택적 라이브러리 또는 플러그인을/opt/flink/lib또는/opt/flink/plugins로 (심링크) 활성화/opt/flink/lib에 다른 라이브러리 추가(예: Hadoop)/opt/flink/plugins에 다른 플러그인 추가
Flink 이미지를 여러 방법으로 사용자 정의할 수 있습니다.
임의의 부트스트랩 작업을 실행할 수 있는 사용자 정의 스크립트로 컨테이너 진입점을 오버라이드할 수 있습니다. 마지막에는 지원되는 배포 모드에서 설명한 것과 같은 인자로 Flink 이미지의 표준 /docker-entrypoint.sh 스크립트를 호출할 수 있습니다.
다음 예시는 더 많은 라이브러리와 플러그인을 활성화하는 사용자 정의 진입점 스크립트를 만듭니다. 사용자 정의 스크립트, 사용자 정의 라이브러리와 플러그인은 마운트된 볼륨에서 제공됩니다. 그런 다음 Flink 이미지의 표준 진입점 스크립트를 실행합니다.
# create custom_lib.jar
# create custom_plugin.jar
$ echo "
# enable an optional library
ln -fs /opt/flink/opt/flink-sql-gateway-*.jar /opt/flink/lib/
# enable a custom library
ln -fs /mnt/custom_lib.jar /opt/flink/lib/
mkdir -p /opt/flink/plugins/flink-s3-fs-hadoop
# enable an optional plugin
ln -fs /opt/flink/opt/flink-s3-fs-hadoop-*.jar /opt/flink/plugins/flink-s3-fs-hadoop/
mkdir -p /opt/flink/plugins/custom_plugin
# enable a custom plugin
ln -fs /mnt/custom_plugin.jar /opt/flink/plugins/custom_plugin/
/docker-entrypoint.sh <jobmanager|standalone-job|taskmanager>
" > custom_entry_point_script.sh
$ chmod 755 custom_entry_point_script.sh
$ docker run \
--mount type=bind,src=$(pwd),target=/mnt
flink:2.3.0-scala_2.12 /mnt/custom_entry_point_script.sh
사용자 정의 Dockerfile을 작성해 Flink 이미지를 확장하고 사용자 정의 이미지를 빌드합니다.
FROM flink
RUN set -ex; apt-get update; apt-get -y install python
ADD /host/path/to/config.yaml /container/local/path/to/custom/conf/config.yaml
ADD /host/path/to/log4j.properties /container/local/path/to/custom/conf/log4j.properties
RUN ln -fs /opt/flink/opt/flink-sql-gateway-*.jar /opt/flink/lib/.
RUN mkdir -p /opt/flink/plugins/flink-s3-fs-hadoop
RUN ln -fs /opt/flink/opt/flink-s3-fs-hadoop-*.jar /opt/flink/plugins/flink-s3-fs-hadoop/.
ENV VAR_NAME value
빌드 명령:
$ docker build --tag custom_flink_image .
# optional push to your docker image registry if you have it,
# e.g. to distribute the custom image to your cluster
$ docker push custom_flink_image