@@ -52,6 +52,7 @@ def get_image_mounts(
5252 kube_config_path : Optional [str ],
5353 requirements : pathlib .Path ,
5454 database_mounts : Dict [pathlib .Path , str ],
55+ data_path : Optional [str ] = None ,
5556) -> List [docker .types .Mount ]:
5657 """
5758 Return list of docker volumes to be mounted inside container.
@@ -63,11 +64,14 @@ def get_image_mounts(
6364 - environment airflow sqlite db file location
6465 - database_mounts which contains the path for database mounts
6566 """
67+ # Backwards compatibility: when no explicit data_path is given, the data
68+ # directory lives inside the environment directory (the original behaviour).
69+ data_path = data_path if data_path is not None else env_path / "data"
6670 mount_paths = {
6771 requirements : "composer_requirements.txt" ,
6872 dags_path : "gcs/dags/" ,
6973 plugins_path : "gcs/plugins/" ,
70- env_path / "data" : "gcs/data/" ,
74+ data_path : "gcs/data/" ,
7175 gcloud_config_path : ".config/gcloud" ,
7276 ** database_mounts ,
7377 }
@@ -373,6 +377,11 @@ def __init__(self, env_dir_path: pathlib.Path, port: Optional[int]):
373377 self .plugins_path = self .get_str_param ("plugins_path" )
374378 else :
375379 self .plugins_path = files .resolve_plugins_path (None , env_dir_path )
380+ # Backwards compatibility: don't fail on missing data_path
381+ if "data_path" in self .config :
382+ self .data_path = self .get_str_param ("data_path" )
383+ else :
384+ self .data_path = files .resolve_data_path (None , env_dir_path )
376385 self .dag_dir_list_interval = self .parse_int_param (
377386 "dag_dir_list_interval" , allowed_range = (0 ,)
378387 )
@@ -457,6 +466,7 @@ def __init__(
457466 location : str ,
458467 dags_path : Optional [str ],
459468 plugins_path : Optional [str ] = None ,
469+ data_path : Optional [str ] = None ,
460470 dag_dir_list_interval : int = 10 ,
461471 database_engine : str = constants .DatabaseEngine .postgresql ,
462472 memory_limit : Optional [str ] = None ,
@@ -488,6 +498,7 @@ def __init__(
488498 self .plugins_path = files .resolve_plugins_path (
489499 plugins_path , env_dir_path
490500 )
501+ self .data_path = files .resolve_data_path (data_path , env_dir_path )
491502 self .dag_dir_list_interval = dag_dir_list_interval
492503 self .database_engine = database_engine
493504 self .is_database_sqlite3 = (
@@ -563,6 +574,7 @@ def load_from_config(cls, env_dir_path: pathlib.Path, port: Optional[int]):
563574 location = config .location ,
564575 dags_path = config .dags_path ,
565576 plugins_path = config .plugins_path ,
577+ data_path = config .data_path ,
566578 dag_dir_list_interval = config .dag_dir_list_interval ,
567579 port = config .port ,
568580 database_engine = config .database_engine ,
@@ -582,6 +594,7 @@ def from_source_environment(
582594 dags_path : Optional [str ],
583595 plugins_path : Optional [str ],
584596 database_engine : str ,
597+ data_path : Optional [str ] = None ,
585598 memory_limit : Optional [str ] = None ,
586599 cpu_count : Optional [int ] = None ,
587600 ):
@@ -606,6 +619,7 @@ def from_source_environment(
606619 location = location ,
607620 dags_path = dags_path ,
608621 plugins_path = plugins_path ,
622+ data_path = data_path ,
609623 dag_dir_list_interval = 10 ,
610624 port = web_server_port ,
611625 pypi_packages = pypi_packages ,
@@ -720,6 +734,7 @@ def write_environment_config_to_config_file(self):
720734 "composer_project_id" : self .project_id ,
721735 "dags_path" : self .dags_path ,
722736 "plugins_path" : self .plugins_path ,
737+ "data_path" : self .data_path ,
723738 "dag_dir_list_interval" : int (self .dag_dir_list_interval ),
724739 "port" : int (self .port ),
725740 "database_engine" : self .database_engine ,
@@ -802,6 +817,7 @@ def create_docker_container(self):
802817 utils .resolve_kube_config_path (),
803818 self .requirements_file ,
804819 db_mounts ,
820+ self .data_path ,
805821 )
806822 db_vars = db_extras ["env_vars" ]
807823 default_vars = self .get_default_environment_variables (db_vars )
@@ -886,6 +902,7 @@ def create_db_docker_container(self):
886902 utils .resolve_kube_config_path (),
887903 self .requirements_file ,
888904 db_mounts ,
905+ self .data_path ,
889906 )
890907 db_vars = db_extras ["env_vars" ]
891908 db_ports = db_extras ["ports" ]
@@ -967,7 +984,10 @@ def create(self):
967984 assert_image_exists (self .image_version )
968985 self .assert_valid_environment_options ()
969986 files .create_environment_directories (
970- self .env_dir_path , self .dags_path , self .plugins_path
987+ self .env_dir_path ,
988+ self .dags_path ,
989+ self .plugins_path ,
990+ self .data_path ,
971991 )
972992 self .create_database_files (skip_if_exist = False )
973993 self .write_environment_config_to_config_file ()
@@ -1104,6 +1124,7 @@ def start(self, assert_not_running=True):
11041124 self .assert_requirements_exist ()
11051125 files .assert_dag_path_exists (self .dags_path )
11061126 files .assert_plugins_path_exists (self .plugins_path )
1127+ files .assert_data_path_exists (self .data_path )
11071128
11081129 self .create_database_files ()
11091130 db_path = (
@@ -1153,6 +1174,7 @@ def print_start_message(self):
11531174 env_name = self .name ,
11541175 dags_path = self .dags_path ,
11551176 plugins_path = self .plugins_path ,
1177+ data_path = self .data_path ,
11561178 port = self .port ,
11571179 )
11581180 )
@@ -1278,6 +1300,7 @@ def prepare_env_description(self, env_status: str) -> str:
12781300 image_version = self .image_version ,
12791301 dags_path = self .dags_path ,
12801302 plugins_path = self .plugins_path ,
1303+ data_path = self .data_path ,
12811304 gcloud_path = utils .resolve_gcloud_config_path (),
12821305 )
12831306 + (
0 commit comments