Changeset 1494 in genappalpha


Ignore:
Timestamp:
Jul 20, 2018, 12:40:30 PM (3 years ago)
Author:
ehb
Message:

docker target language updates

Location:
languages/docker
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • languages/docker/build_docker_footer.pl

    r1493 r1494  
    11# process each module with dependencies
    2 
    3 # process each module with dependencies
    4 
    5 my $warn;
    6 my $error;
    72
    83foreach my $mod ( keys %dependencies ) {
     
    105    if ( $dependencies{ $mod } =~ /^__dependencies__/ ) {
    116        print "no dependencies\n";
    12         $error .= "Module '$mod' has no 'dependencies' defined, can not create docker container.\n";
     7        $error .= "Module '$mod' : no dependencies defined, can not create docker container.\n";
    138        next;
    149    }
     
    2217
    2318
    24     # mkdir for dockerfile
    25 
    2619    # build up and output docker file based upon dependencies
    2720    # 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        }
    2834
    29     # create command to build and post (?) dockerfile
     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`;
    30134}
    31 
    32 
    33 
    34135   
    35136print "Warnings:\n$warn" if $warn;
    36 print "Errors:\n$error" if $error;
     137die "Errors:\n$error" if $error;
  • languages/docker/build_docker_header.pl

    r1493 r1494  
    4343my %module_json;
    4444my $executable_path = "__executable_path:docker__";
     45my $workdir = "/genapp/run";
    4546
     47my $wdir = $0;
     48$wdir =~ s/\/[^\/]*$//;
     49chdir $wdir || die "Error: could not chdir to $wdir\n";
Note: See TracChangeset for help on using the changeset viewer.