1
+ import argparse
2
+ import os
3
+ import subprocess
4
+ import sys
5
+
6
+ start = """FROM postgres:17.2
7
+ ENV POSTGRES_USER=postgres
8
+ ENV POSTGRES_PASSWORD=postgres
9
+ RUN apt update && apt install git make -y
10
+ RUN mkdir /data
11
+
12
+ USER postgres
13
+
14
+ RUN cd ~
15
+ """
16
+
17
+ mimic_iv = """#!/bin/bash
18
+ set -e
19
+ echo "START BUILDING MIMIC-IV"
20
+
21
+ git clone https://github.com/MIT-LCP/mimic-code.git /tmp/mimic-code
22
+ cd /tmp/mimic-code
23
+ if ! psql -U postgres -lqt | cut -d \| -f 1 | grep -wq mimiciv; then
24
+ createdb mimiciv
25
+ fi
26
+ psql -d mimiciv -f mimic-iv/buildmimic/postgres/create.sql
27
+ psql -d mimiciv -v ON_ERROR_STOP=1 -v mimic_data_dir=/tmp/mimic_iv -f mimic-iv/buildmimic/postgres/load{}.sql
28
+ psql -d mimiciv -v ON_ERROR_STOP=1 -v mimic_data_dir=/tmp/mimic_iv -f mimic-iv/buildmimic/postgres/constraint.sql
29
+ psql -d mimiciv -v ON_ERROR_STOP=1 -v mimic_data_dir=/tmp/mimic_iv -f mimic-iv/buildmimic/postgres/index.sql
30
+ psql -d mimiciv -v ON_ERROR_STOP=1 -f mimic-iv/buildmimic/postgres/validate.sql
31
+ cd mimic-iv/concepts_postgres
32
+ psql -d mimiciv -v ON_ERROR_STOP=1 -f postgres-make-concepts.sql
33
+
34
+ cd ~
35
+ rm -rf /tmp/mimic-code
36
+
37
+ echo "FINISH BUILDING MIMIC-IV"
38
+ """
39
+
40
+ mimic_iv_ed = """#!/bin/bash
41
+ set -e
42
+ echo "START BUILDING MIMIC-IV-ED"
43
+
44
+ git clone https://github.com/MIT-LCP/mimic-code.git /tmp/mimic-code
45
+ cd /tmp/mimic-code
46
+ if ! psql -U postgres -lqt | cut -d \| -f 1 | grep -wq mimiciv; then
47
+ createdb mimiciv
48
+ fi
49
+ psql -d mimiciv -f mimic-iv-ed/buildmimic/postgres/create.sql
50
+ psql -d mimiciv -v ON_ERROR_STOP=1 -v mimic_data_dir=/tmp/mimic_iv_ed -f mimic-iv-ed/buildmimic/postgres/load_gz.sql
51
+ psql -d mimiciv -v ON_ERROR_STOP=1 -v mimic_data_dir=/tmp/mimic_iv_ed -f mimic-iv-ed/buildmimic/postgres/validate.sql
52
+
53
+ cd ~
54
+ rm -rf /tmp/mimic-code
55
+
56
+ echo "FINISH BUILDING MIMIC-IV-ED"
57
+ """
58
+
59
+ mimic_iii = """#!/bin/bash
60
+ set -e
61
+ echo "START BUILDING MIMIC-III"
62
+
63
+ git clone https://github.com/MIT-LCP/mimic-code.git /tmp/mimic-code
64
+ cd /tmp/mimic-code/mimic-iii/buildmimic/postgres
65
+ createdb mimiciii
66
+ make mimic{} datadir="/tmp/mimic_iii" DBNAME="mimiciii"
67
+ cd ../../concepts_postgres
68
+ psql -d mimiciii -c "SET search_path TO mimiciii;" -f postgres-functions.sql -f postgres-make-concepts.sql
69
+
70
+ cd ~
71
+ rm -rf /tmp/mimic-code
72
+
73
+ echo "FINISH BUILDING MIMIC-III"
74
+ """
75
+
76
+
77
+ eicu = """
78
+ #!/bin/bash
79
+ set -e
80
+ echo "START BUILDING eICU"
81
+
82
+ git clone https://github.com/mit-lcp/eicu-code.git /tmp/eicu-code
83
+ cd /tmp/eicu-code/build-db/postgres
84
+ make initialize
85
+ make eicu{} datadir="/tmp/eicu/"
86
+
87
+ cd ~
88
+ rm -rf /tmp/eicu-code
89
+
90
+ echo "FINISH BUILDING eICU"
91
+ """
92
+
93
+ script_dict = {
94
+ "mimic_iv" : mimic_iv ,
95
+ "mimic_iv_ed" : mimic_iv_ed ,
96
+ "mimic_iii" : mimic_iii ,
97
+ "eicu" : eicu ,
98
+ }
99
+
100
+
101
+ def pares_args ():
102
+ parser = argparse .ArgumentParser (description = 'Build a Dockerfile' )
103
+ parser .add_argument ("--mimic_iv" , type = str , help = "MIMIC-IV Path" )
104
+ parser .add_argument ("--mimic_iv_ed" , type = str , help = "MIMIC-IV-ED Path" )
105
+ parser .add_argument ("--mimic_iii" , type = str , help = "MIMIC-III Path" )
106
+ parser .add_argument ("--eicu" , type = str , help = "eicu Path" )
107
+
108
+ return parser .parse_args ()
109
+
110
+ def add_dataset (data_path , data_name , check_file , ext ):
111
+ if os .path .exists (os .path .join (data_path , check_file + '.csv' )):
112
+ ext = ""
113
+ elif os .path .exists (os .path .join (data_path , check_file + ".csv.gz" )):
114
+ pass
115
+ else :
116
+ raise ValueError (f"Invalid { data_name } Path" )
117
+
118
+ with open (f"{ data_name } .sh" , 'w' ) as f :
119
+ f .write (script_dict [data_name ].format (ext ))
120
+
121
+ mount_args = ["-v" , f"{ data_path } :/tmp/{ data_name } " ]
122
+ write_content = f"COPY { data_name } .sh /docker-entrypoint-initdb.d/{ data_name } .sh\n "
123
+
124
+ return mount_args , write_content
125
+
126
+
127
+ def main ():
128
+ args = pares_args ()
129
+ dockerfile = open ("Dockerfile" , "w" )
130
+ dockerfile .write (start )
131
+
132
+ run_args = []
133
+
134
+ if args .mimic_iv :
135
+ mount_args , write_content = add_dataset (args .mimic_iv , "mimic_iv" , "hosp/admissions" , "_gz" )
136
+ run_args .extend (mount_args )
137
+ dockerfile .write (write_content )
138
+
139
+ if args .mimic_iv_ed :
140
+ mount_args , write_content = add_dataset (args .mimic_iv_ed , "mimic_iv_ed" , "edstays" , "_gz" )
141
+ run_args .extend (mount_args )
142
+ dockerfile .write (write_content )
143
+
144
+ if args .mimic_iii :
145
+ mount_args , write_content = add_dataset (args .mimic_iii , "mimic_iii" , "ADMISSIONS" , "-gz" )
146
+ run_args .extend (mount_args )
147
+ dockerfile .write (write_content )
148
+
149
+ if args .eicu :
150
+ mount_args , write_content = add_dataset (args .eicu , "eicu" , "patient" , "-gz" )
151
+ run_args .extend (mount_args )
152
+ dockerfile .write (write_content )
153
+
154
+ dockerfile .close ()
155
+ print ("Dockerfile created" )
156
+
157
+ # Remove container if exists
158
+ subprocess .run (["docker" , "stop" , "ehr_postgres" ], stderr = subprocess .DEVNULL )
159
+ subprocess .run (["docker" , "rm" , "ehr_postgres" ], stderr = subprocess .DEVNULL )
160
+ subprocess .run (["docker" , "image" , "rm" , "ehr_postgres" ], stderr = subprocess .DEVNULL )
161
+ subprocess .run (["docker" , "build" , "-t" , "ehr_postgres" , "." ])
162
+ subprocess .run (["docker" , "run" , "--name" , "ehr_postgres" , "-d" , "-p" , "5432:5432" , "-e" , "POSTGRES_PASSWORD=postgres" , * run_args , "ehr_postgres" ])
163
+
164
+ print ("Docker container created" )
165
+
166
+ process = subprocess .Popen (
167
+ ["docker" , "logs" , "-f" , "ehr_postgres" ],
168
+ stdout = subprocess .PIPE ,
169
+ stderr = subprocess .STDOUT ,
170
+ text = True
171
+ )
172
+
173
+ for line in process .stdout :
174
+ sys .stdout .write (line )
175
+ sys .stdout .flush ()
176
+
177
+ if "PostgreSQL init process complete" in line :
178
+ print ("Initialization complete!" )
179
+ process .terminate ()
180
+ break
181
+
182
+ print ("EHR_POSTGRES is ready!" )
183
+
184
+ if __name__ == "__main__" :
185
+ main ()
0 commit comments