написать файл из контейнера докеров в google-cloud-composer

Некоторый контекст: я использую composer-1.3.0-airflow-1.10.0

Установлен пакет PyPi docker===2.7.0

Некоторое время я пытался использовать DockerOperator, но мне нужно вытащить изображения из частного реестра gcr.io, расположенного в другом gcp-проекте, и это беспорядок.

Я не буду вдаваться в подробности, почему я отказался от этого ... Я переключился на простой PythonOperator, используемый для извлечения и запуска образа докера. Вот как идет Оператор:

def runImage(**kwargs):
    workingDir = "/app"
    imageName = "eu.gcr.io/private-registry/image"
    volume = {"/home/airflow/gcs/data/": {"bind": "/out/", "mode": "rw"}}
    userUid = os.getuid()
    command = getContainerCommand()
    client = getClient()
    print("pulling image")
    image = pullDockerImage(client, imageName)
    print("image pulled. %s", image.id)
    output = client.containers.run(
        image=imageName,
        command=command,
        volumes=volume,
        privileged=True,
        working_dir=workingDir,
        remove=True,
        read_only=False,
        user=userUid)
    print output
    return True


task = PythonOperator(
    task_id="test_pull_docker_image",
    python_callable=runImage,
    dag=dag
)

Изображение хорошо натянуто. И он побежал (что уже было победой).

Контейнер записывает некоторые файлы в /out/, который я смонтировал как том в /home/airflow/gcs/data с правами rw.

Опции working_dir, user, privileged, read_only были добавлены для тестирования, но я не думаю, что они актуальны.

Файлы не создаются. запись файла прямо в pyhton в /home/airflow/gcs/data работает нормально.

Сам контейнер - это соблюдаемый C #. Локально, если контейнер не может записать файлы, я получаю сообщение об ошибке (например, Unhandled Exception: System.UnauthorizedAccessException: Access to the path '/out/file.txt' is denied. ---> System.IO.IOException: Permission denied)

Но когда я запускаю DAG внутри airlfow composer, все выглядит нормально, вывод контейнера такой, как ожидалось, ошибок не возникает.

Может быть, Dockerfile может быть полезен:

FROM microsoft/dotnet:2.1-sdk AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:2.1-sdk
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "programm.dll"]

Итак, вопрос в том,

Почему не записывает файлы? А как разрешить контейнеру записывать файлы в /home/airflow/gcs/data?


person donkino    schedule 14.11.2018    source источник


Ответы (1)


Итак, я решил эту проблему благодаря моему другому вопросу

Ответ здесь состоит из двух частей:

/home/airflow/gcs - это том gcsfuse. Использование этого каталога для DockerVolume просто не работает (может работать, добавив плагин, я потерял ссылку для этого: /)

Мы хотим добавить объем внутри рабочих потоков воздуха, мы можем сделать это, обновив конфигурацию kubectl: см. этот вопрос о том, как обновить config. Мы хотим добавить hostPath:

containers:
  ...
  securityContext:
    privileged: true
    runAsUser: 0
    capabilities:
      add: 
      - SYS_ADMIN
  ...
  volumeMounts:
  - mountPath: /etc/airflow/airflow_cfg
    name: airflow-config
  - mountPath: /home/airflow/gcs
    name: gcsdir
  - mountPath: /var/run/docker.sock
    name: docker-host
  - mountPath: /bin/docker
    name: docker-app
  - mountPath: /path/you/want/as/volume
    name: mountname
  ...
  volumes:
  - configMap:
    defaultMode: 420
    name: airflow-configmap
  name: airflow-config
  - emptyDir: {}
    name: gcsdir
  - hostPath:
      path: /path/you/want/as/volume
      type: DirectoryOrCreate
    name: mountname
  - hostPath:
      path: /var/run/docker.sock
      type: ""
    name: docker-host
  - hostPath:
      path: /usr/bin/docker
      type: ""
    name: docker-app

И теперь в определении DAG мы можем использовать volume = {"/path/you/want/as/volume": {"bind": "/out/", "mode": "rw"}}

Файл будет существовать внутри POD, и вы можете использовать другую задачу, чтобы загрузить их в корзину gcs или около того.

Надеюсь, это может немного помочь :)

person donkino    schedule 16.11.2018