instead of relying on shared folders, use docker api archive function. un tar is still a bit cumbersome, but works.
This commit is contained in:
2
Gemfile
2
Gemfile
@ -7,7 +7,7 @@ gem 'carrierwave'
|
|||||||
gem 'coffee-rails', '~> 4.0.0'
|
gem 'coffee-rails', '~> 4.0.0'
|
||||||
gem 'concurrent-ruby', '~> 1.0.0'
|
gem 'concurrent-ruby', '~> 1.0.0'
|
||||||
gem 'concurrent-ruby-ext', '~> 1.0.0', platform: :ruby
|
gem 'concurrent-ruby-ext', '~> 1.0.0', platform: :ruby
|
||||||
gem 'docker-api','~> 1.21.1', require: 'docker'
|
gem 'docker-api','~> 1.25.0', require: 'docker'
|
||||||
gem 'factory_girl_rails', '~> 4.0'
|
gem 'factory_girl_rails', '~> 4.0'
|
||||||
gem 'forgery'
|
gem 'forgery'
|
||||||
gem 'highline'
|
gem 'highline'
|
||||||
|
@ -103,13 +103,13 @@ GEM
|
|||||||
debug_inspector (0.0.2)
|
debug_inspector (0.0.2)
|
||||||
diff-lcs (1.2.5)
|
diff-lcs (1.2.5)
|
||||||
docile (1.1.5)
|
docile (1.1.5)
|
||||||
docker-api (1.21.1)
|
docker-api (1.25.0)
|
||||||
excon (>= 0.38.0)
|
excon (>= 0.38.0)
|
||||||
json
|
json
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
eventmachine (1.0.8)
|
eventmachine (1.0.8)
|
||||||
eventmachine (1.0.8-java)
|
eventmachine (1.0.8-java)
|
||||||
excon (0.45.2)
|
excon (0.45.4)
|
||||||
execjs (2.5.2)
|
execjs (2.5.2)
|
||||||
factory_girl (4.5.0)
|
factory_girl (4.5.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
@ -350,7 +350,7 @@ DEPENDENCIES
|
|||||||
concurrent-ruby (~> 1.0.0)
|
concurrent-ruby (~> 1.0.0)
|
||||||
concurrent-ruby-ext (~> 1.0.0)
|
concurrent-ruby-ext (~> 1.0.0)
|
||||||
database_cleaner
|
database_cleaner
|
||||||
docker-api (~> 1.21.1)
|
docker-api (~> 1.25.0)
|
||||||
factory_girl_rails (~> 4.0)
|
factory_girl_rails (~> 4.0)
|
||||||
faye-websocket
|
faye-websocket
|
||||||
forgery
|
forgery
|
||||||
|
@ -128,6 +128,23 @@ class DockerClient
|
|||||||
end
|
end
|
||||||
private :create_workspace_file
|
private :create_workspace_file
|
||||||
|
|
||||||
|
def create_workspace_files_transmit(container, submission)
|
||||||
|
# create a temporary dir, put all files in it, and put it into the container. the dir is automatically removed when leaving the block.
|
||||||
|
Dir.mktmpdir {|dir|
|
||||||
|
submission.collect_files.each do |file|
|
||||||
|
disk_file = File.new(dir + '/' + (file.path || '') + file.name_with_extension, 'w')
|
||||||
|
disk_file.write(file.content)
|
||||||
|
disk_file.close
|
||||||
|
end
|
||||||
|
|
||||||
|
# tar the files in dir and put the tar to CONTAINER_WORKSPACE_PATH in the container
|
||||||
|
container.archive_in(dir, CONTAINER_WORKSPACE_PATH, overwrite: false)
|
||||||
|
|
||||||
|
# untar the tar file placed in the CONTAINER_WORKSPACE_PATH
|
||||||
|
container.exec(['bash', '-c', 'tar -xf ' + CONTAINER_WORKSPACE_PATH + '/' + dir.split('/tmp/')[1] + ' -C ' + CONTAINER_WORKSPACE_PATH])
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def self.destroy_container(container)
|
def self.destroy_container(container)
|
||||||
Rails.logger.info('destroying container ' + container.to_s)
|
Rails.logger.info('destroying container ' + container.to_s)
|
||||||
container.stop.kill
|
container.stop.kill
|
||||||
@ -242,7 +259,7 @@ class DockerClient
|
|||||||
Run commands by attaching a websocket to Docker.
|
Run commands by attaching a websocket to Docker.
|
||||||
"""
|
"""
|
||||||
command = submission.execution_environment.run_command % command_substitutions(filename)
|
command = submission.execution_environment.run_command % command_substitutions(filename)
|
||||||
create_workspace_files = proc { create_workspace_files(container, submission) }
|
create_workspace_files = proc { create_workspace_files_transmit(container, submission) }
|
||||||
execute_websocket_command(command, create_workspace_files, block)
|
execute_websocket_command(command, create_workspace_files, block)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -251,7 +268,7 @@ class DockerClient
|
|||||||
Stick to existing Docker API with exec command.
|
Stick to existing Docker API with exec command.
|
||||||
"""
|
"""
|
||||||
command = submission.execution_environment.test_command % command_substitutions(filename)
|
command = submission.execution_environment.test_command % command_substitutions(filename)
|
||||||
create_workspace_files = proc { create_workspace_files(container, submission) }
|
create_workspace_files = proc { create_workspace_files_transmit(container, submission) }
|
||||||
execute_command(command, create_workspace_files, block)
|
execute_command(command, create_workspace_files, block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user