一些上下文:我正在使用 composer-1.3.0-airflow-1.10.0
安装的 PyPi 包 docker===2.7.0
有一段时间我尝试使用 DockerOperator,但我需要从位于另一个 gcp 项目中的私有 gcr.io 注册表中提取图像,这是一团糟。
我不会详细说明为什么我放弃了。我切换到一个简单的PythonOperator用于拉取和运行 docker 镜像。下面是 Operator 的工作方式:
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)
但是当我在 airlfow composer 中运行 DAG 时,一切看起来都很好,容器输出符合预期,没有出现错误。
也许 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?
宝慕林4294392
相关分类