lib/dockdev/image.rb in dockdev-0.3.6 vs lib/dockdev/image.rb in dockdev-0.3.7

- old
+ new

@@ -1,8 +1,12 @@ require 'docker/cli' +require 'securerandom' + +require_relative 'user_info' + module Dockdev class Image include TR::CondUtils def initialize(name) @@ -18,34 +22,113 @@ raise Error, "Error triggered during find existing image : #{res.err_stream}" end end def new_container(cont_name, opts = {}) + optss = { interactive: true, tty: true, - container_name: cont_name + container_name: cont_name, + match_user: TR::RTUtils.on_linux? } optss.merge!(opts) + @cmd_fact.create_container_from_image(@image_name, optss).run + end def build(dockerfile, opts = {}) + + dockerfilePath = dockerfile + if is_transfer_user?(opts) + cont = append_transfer_user_in_dockerfile(dockerfile) + dockerfilePath = generated_dockerfile + File.open(dockerfilePath, "w") do |f| + f.write cont + end + end + optss = { context_root: opts[:root], - dockerfile: dockerfile + dockerfile: dockerfilePath } optss.merge!(opts) @cmd_fact.build_image(@image_name, optss).run + + FileUtils.rm(generated_dockerfile) if File.exist?(generated_dockerfile) and not is_keep_generated_dockerfile? + end def destroy res = @cmd_fact.delete_image(@image_name).run if res.success? not res.is_out_stream_empty? else raise Error, "Error triggered during deleting image : #{res.err_stream}" end + end + + + private + def logger + Dockdev.logger(:dockdev_image) + end + + def is_keep_generated_dockerfile? + v = ENV["DOCKDEV_KEEP_GENERATED_DOCKERFILE"] + is_empty?(v) ? false : (v.downcase == "true") ? true : false + end + + def generated_dockerfile + "Dockerfile-dockdev" + end + + def is_transfer_user?(opts = {}) + if TR::RTUtils.on_linux? + true + else + (opts[:match_user].nil? || not_bool?(opts[:match_user])) ? false : opts[:match_user] + end + end + + def append_transfer_user_in_dockerfile(file) + if File.exist?(file) + logger.debug "Append transfer user in dockerfile '#{file}'" + res = [] + cont = File.read(file) + indx = cont =~ /CMD/ + if indx != nil + + res << cont[0...indx] + res << transfer_user_command + res << cont[indx..-1] + + else + + res << cont + res << transfer_user_command + + end + + res.join + + else + "" + end + end + + def transfer_user_command + + ui = UserInfo.user_info + gi = UserInfo.group_info + + res = [] + res << "RUN apt-get update && apt-get install -y sudo" + res << "RUN groupadd -f -g #{gi[:gid]} #{gi[:group_name]} && useradd -u #{ui[:uid]} -g #{gi[:gid]} -m #{ui[:login]} && usermod -aG sudo #{ui[:login]} && echo '#{ui[:login]} ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers" + res << "USER #{ui[:login]}" + res.join("\n") + end end end