записать файл из контейнера докера в google-cloud-composer - PullRequest
0 голосов
/ 14 ноября 2018

Некоторый контекст: Я использую 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?

1 Ответ

0 голосов
/ 16 ноября 2018

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

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

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

Мы хотим добавить том внутри airflow-working, мы можем сделать это, обновив конфигурацию kubectl: см. этот вопрос , чтобы узнать, как обновить конфиг. Мы хотим добавить 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 или около того.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...