Как извлечь изображение докера моего собственного частного репозитория с помощью DockerOperator воздушного потока?

# #python #docker #docker-compose #gitlab #airflow

Вопрос:

Я использую установку Airflow через образ Docker в экземпляре AWS, и я создал образ docker своего проекта и отправил его в реестр контейнеров GitLab. Теперь я хочу использовать это изображение в airflow для ежедневного запуска, я знаю, что когда мы используем наше собственное личное изображение, мы должны пройти аутентификацию, чтобы я мог войти в систему с помощью dag airflow, файла или любого метода для решения этой проблемы. Мой код

 stripetos3_scheduler = DockerOperator(
    task_id='stripe-to-s3',
    image='registry.gitlab.com/mobinalhassan/stripetos3dags:latest',
    auto_remove=True,
    force_pull=True,
    dag=dag
)
 

Ответ №1:

Используйте imagePullSecrets, упомянутые здесь https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/stable/operators.html

Создайте такой секрет, как этот

 apiVersion: v1
kind: Secret
metadata:
name: {{.Release.Name}}-image-pull-secret
namespace: {{.Release.Namespace}}
data:
  .dockerconfigjson: {{ template "dockerConfigTemplate" . }}
type: kubernetes.io/dockerconfigjson
 

Создайте шаблон, который используется вышеуказанным Секретным компонентом

 {{- define "dockerConfigTemplate" }}
{{- if .Values.images.airflow.registry }}
{{- $url := .Values.images.airflow.registry.url }}
{{- $name := .Values.images.airflow.registry.username }}
{{- $password := .Values.images.airflow.registry.password }}
{{- $email := .Values.images.airflow.registry.email }}
{{- $auth := (printf "%s:%s" $name $password | b64enc) }}

{{- printf "{"auths":{"%s": 
{"username":"%s","password":"%s","email":"%s","auth":"%s"}}}" 
$url $name $password $email $auth | b64enc }}

{{- end }}
{{- end }}
 

В моем случае я развертываю Airflow (пользовательский образ, в котором также есть Dag) из моего личного реестра

Я экспортирую этот секрет в качестве переменной Env, которая может использоваться другими компонентами

 apiVersion: v1
kind: Pod
metadata:
  name: worker-pod
spec:
  containers:
    - args: []
      command: []
      env:
      - name: OI_DATAPIPELINE_IMAGE_PULL_SECRET
        value: {{.Release.Name}}-pipeline-image-pull-secret
 

Теперь нам нужно использовать созданный выше секрет в наших Dag следующим образом

 data_pipeline = KubernetesPodOperator(
namespace='default',
name="DataPipeline",
task_id="data_pipeline",
image='*********.jfrog.io/*****:latest',
image_pull_secrets= 
[k8s.V1LocalObjectReference('OI_DATAPIPELINE_IMAGE_PULL_SECRET')],
env_from=env_from,
cmds=["./deployments/data_pipeline/start.sh"],
get_logs=True,
is_delete_operator_pod=True,
dag=dag
)
 

Комментарии:

1. не могли бы вы уточнить, как это сделать?

2. @DanielM Я обновил информацию о том, как использовать секреты при извлечении изображения из частного репо

3. Можете ли вы объяснить, как я могу создать секрет для извлечения образа docker из реестра контейнеров GitLab?

4. Автор ответа использует DockerOperator, зачем вы даете ему «решение» с помощью KubernetesPodOperator?