source: genappalpha/languages/docker/build_docker_footer.pl @ 1494

Last change on this file since 1494 was 1494, checked in by ehb, 2 years ago

docker target language updates

File size: 4.3 KB
Line 
1# process each module with dependencies
2
3foreach my $mod ( keys %dependencies ) {
4    print "checking $mod\n";
5    if ( $dependencies{ $mod } =~ /^__dependencies__/ ) {
6        print "no dependencies\n";
7        $error .= "Module '$mod' : no dependencies defined, can not create docker container.\n";
8        next;
9    }
10    $depjson = decode_json( $dependencies{ $mod } );
11    $modjson = decode_json( $module_json{ $mod } );
12    if ( !$$modjson{'executable'} ) {
13        $error .= "Module '$mod' has no 'executable' defined.\n";
14        next;
15    }
16    print "executable is $$modjson{'executable'}\n";
17
18
19    # build up and output docker file based upon dependencies
20    # executable needs copying
21    my $out;
22    my $has_error;
23    my $has_base;
24    my @copys;
25    my $has_cpanm;
26   
27    for ( my $i = 0; $i < @$depjson; ++$i ) {
28        my $entry = $$depjson[$i];
29        if ( scalar ( keys %$entry ) != 1 ) {
30            $has_error++;
31            $error .= "Module '$mod' : dependencies entry " . ( $i + 1 ) . " '" . encode_json( $entry ) . "' does not have exactly 1 key\n";
32            break;
33        }
34
35        my $k = (keys %$entry)[0];
36        my $v = $$entry{$k};
37        $k = lc( $k );
38        print "k $k\n";
39        if ( ref( $v ) ne 'ARRAY' ) {
40            my @v = ( $v );
41            $v = \@v;
42        }
43        print "v " . ref( $v ) . "\n";
44        # create command to build and post (?) dockerfile
45
46        for ( my $j = 0; $j < @$v; ++$j ) {
47            print "\$v[$j] = $$v[$j]\n";
48            my $val = $$v[$j];
49            if ( length( ref( $val ) ) ) {
50                $error .= "Module '$mod' : dependencies entry " . ( $i + 1 ) . " '" . encode_json( $entry ) . "' improper value in list entry number " . ( $j + 1 ) . "\n";
51                $has_error++;
52                next;
53            }
54            print "length ref val = " . length( ref( $val ) ) . "\n";
55            if ( $k eq 'base' ) {
56                if ( $hasbase ) {
57                    $error .= "Module '$mod' : dependencies entry " . ( $i + 1 ) . " '" . encode_json( $entry ) . "' multiple 'base' tags found, only one allowed\n";
58                    $has_error;
59                    last;
60                }
61                $out .= "FROM $val\n";
62                $out .= "WORKDIR $workdir\n";
63                $has_base++;
64                next;
65            }
66            if ( !$has_base ) {
67                $warn .= "No 'base' entry found in first position, defaulting to 'ubuntu'\n";
68                $out .= "FROM ubuntu\n";
69                $out .= "WORKDIR $workdir\n";
70                $has_base++;
71                next;
72            }               
73            if ( $k eq 'cpan' ) {
74                if ( !$has_cpanm ) {
75                    $out .= "RUN curl -L http://cpanmin.us | perl - App::cpanminus\n";
76                    $out .= "RUN mv /usr/bin/perl /usr/bin/perl.save\n";
77                    $out .= "RUN ln -s /usr/local/bin/perl /usr/bin/perl\n";
78                    $has_cpanm++;
79                }
80                $out .= "RUN cpanm $val\n";
81                next;
82            }
83
84            if ( $k eq 'file' ) {
85                my $dest = $val;
86                $dest =~ s/^.*\///g;
87                $out .= "COPY $dest $dest\n";
88                push @copys, $val;
89                next;
90            }
91
92            $error .= "Module '$mod' : dependencies entry " . ( $i + 1 ) . " '" . encode_json( $entry ) . "' unknown tag '$k'\n";
93            $has_error++;
94            last;
95        }
96    }
97
98    next if $has_error;
99
100    # add executable
101
102    $out .= "COPY $$modjson{'executable'} $$modjson{'executable'}\n";
103    push @copys, "$executable_path/$$modjson{'executable'}";
104
105    # add CMD
106
107    $out .= "CMD [\"./$$modjson{'executable'}\"]\n";
108
109    # write dockerfile
110    if ( !-d $mod ) {
111        if ( -e $mod ) {
112            $error .= "File $mod exists in output folder, but it not directory\n";
113            next;
114        }
115        if ( !mkdir $mod ) {
116            $error .= "Could not create subdir $mod $!\n";
117            next;
118        }
119    }
120       
121    my $df = "$mod/Dockerfile";
122    my $fh;
123    if ( !( open $fh, ">$df" ) ) {
124        $error .= "Could not create file $df for writing\n";
125        next;
126    }
127    print $fh $out;
128    close $fh;
129
130    # do copies
131    $cmd = "cp " . ( join " ", @copys ) . " $mod/";
132    print "$cmd\n";
133    print `$cmd`;
134}
135   
136print "Warnings:\n$warn" if $warn;
137die "Errors:\n$error" if $error;
Note: See TracBrowser for help on using the repository browser.