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