create a container's specific directory before starting the container
This commit is contained in:
@ -28,7 +28,9 @@ class DockerClient
|
|||||||
|
|
||||||
def self.create_container(execution_environment)
|
def self.create_container(execution_environment)
|
||||||
container = Docker::Container.create('Image' => find_image_by_tag(execution_environment.docker_image).info['RepoTags'].first, 'OpenStdin' => true, 'StdinOnce' => true)
|
container = Docker::Container.create('Image' => find_image_by_tag(execution_environment.docker_image).info['RepoTags'].first, 'OpenStdin' => true, 'StdinOnce' => true)
|
||||||
container.start('Binds' => mapped_directories, 'PortBindings' => mapped_ports(execution_environment))
|
local_workspace_path = generate_local_workspace_path
|
||||||
|
FileUtils.mkdir(local_workspace_path)
|
||||||
|
container.start('Binds' => mapped_directories(local_workspace_path), 'PortBindings' => mapped_ports(execution_environment))
|
||||||
container
|
container
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -82,8 +84,8 @@ class DockerClient
|
|||||||
Docker::Image.all.detect { |image| image.info['RepoTags'].flatten.include?(tag) }
|
Docker::Image.all.detect { |image| image.info['RepoTags'].flatten.include?(tag) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.generate_remote_workspace_path
|
def self.generate_local_workspace_path
|
||||||
File.join(config[:workspace_root], SecureRandom.uuid)
|
File.join(LOCAL_WORKSPACE_ROOT, SecureRandom.uuid)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.image_tags
|
def self.image_tags
|
||||||
@ -110,8 +112,9 @@ class DockerClient
|
|||||||
Pathname.new(container.binds.first.split(':').first.sub(config[:workspace_root], LOCAL_WORKSPACE_ROOT.to_s))
|
Pathname.new(container.binds.first.split(':').first.sub(config[:workspace_root], LOCAL_WORKSPACE_ROOT.to_s))
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.mapped_directories
|
def self.mapped_directories(local_workspace_path)
|
||||||
["#{generate_remote_workspace_path}:#{CONTAINER_WORKSPACE_PATH}"]
|
remote_workspace_path = local_workspace_path.sub(LOCAL_WORKSPACE_ROOT.to_s, config[:workspace_root])
|
||||||
|
["#{remote_workspace_path}:#{CONTAINER_WORKSPACE_PATH}"]
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.mapped_ports(execution_environment)
|
def self.mapped_ports(execution_environment)
|
||||||
|
@ -32,6 +32,11 @@ describe DockerClient, docker: true do
|
|||||||
expect(DockerClient).to receive(:find_image_by_tag).with(execution_environment.docker_image).and_call_original
|
expect(DockerClient).to receive(:find_image_by_tag).with(execution_environment.docker_image).and_call_original
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'creates a unique directory' do
|
||||||
|
expect(DockerClient).to receive(:generate_local_workspace_path).and_call_original
|
||||||
|
expect(FileUtils).to receive(:mkdir).with(kind_of(String)).and_call_original
|
||||||
|
end
|
||||||
|
|
||||||
it 'creates a container waiting for input' do
|
it 'creates a container waiting for input' do
|
||||||
expect(Docker::Container).to receive(:create).with('Image' => kind_of(String), 'OpenStdin' => true, 'StdinOnce' => true).and_call_original
|
expect(Docker::Container).to receive(:create).with('Image' => kind_of(String), 'OpenStdin' => true, 'StdinOnce' => true).and_call_original
|
||||||
end
|
end
|
||||||
@ -84,7 +89,7 @@ describe DockerClient, docker: true do
|
|||||||
after(:each) { File.delete(file_path) }
|
after(:each) { File.delete(file_path) }
|
||||||
|
|
||||||
it 'creates a file' do
|
it 'creates a file' do
|
||||||
expect(DockerClient).to receive(:local_workspace_path).and_return(workspace_path)
|
expect(DockerClient).to receive(:local_workspace_path).at_least(:once).and_return(workspace_path)
|
||||||
docker_client.send(:create_workspace_file, container: CONTAINER, file: file)
|
docker_client.send(:create_workspace_file, container: CONTAINER, file: file)
|
||||||
expect(File.exist?(file_path)).to be true
|
expect(File.exist?(file_path)).to be true
|
||||||
expect(File.new(file_path, 'r').read).to eq(file.content)
|
expect(File.new(file_path, 'r').read).to eq(file.content)
|
||||||
@ -92,7 +97,7 @@ describe DockerClient, docker: true do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe '.destroy_container' do
|
describe '.destroy_container' do
|
||||||
let(:container) { DockerClient.send(:create_container, execution_environment) }
|
let(:container) { DockerClient.create_container(execution_environment) }
|
||||||
after(:each) { DockerClient.destroy_container(container) }
|
after(:each) { DockerClient.destroy_container(container) }
|
||||||
|
|
||||||
it 'stops the container' do
|
it 'stops the container' do
|
||||||
@ -166,14 +171,14 @@ describe DockerClient, docker: true do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '.generate_remote_workspace_path' do
|
describe '.generate_local_workspace_path' do
|
||||||
it 'includes the correct workspace root' do
|
it 'includes the correct workspace root' do
|
||||||
expect(DockerClient.generate_remote_workspace_path).to start_with(DockerClient.config[:workspace_root])
|
expect(DockerClient.generate_local_workspace_path).to start_with(DockerClient::LOCAL_WORKSPACE_ROOT.to_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'includes a UUID' do
|
it 'includes a UUID' do
|
||||||
expect(SecureRandom).to receive(:uuid).and_call_original
|
expect(SecureRandom).to receive(:uuid).and_call_original
|
||||||
DockerClient.generate_remote_workspace_path
|
DockerClient.generate_local_workspace_path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -209,8 +214,7 @@ describe DockerClient, docker: true do
|
|||||||
|
|
||||||
describe '.mapped_directories' do
|
describe '.mapped_directories' do
|
||||||
it 'returns a unique mapping' do
|
it 'returns a unique mapping' do
|
||||||
expect(DockerClient).to receive(:generate_remote_workspace_path).and_return(workspace_path)
|
mapping = DockerClient.mapped_directories(workspace_path).first
|
||||||
mapping = DockerClient.send(:mapped_directories).first
|
|
||||||
expect(mapping).to start_with(workspace_path)
|
expect(mapping).to start_with(workspace_path)
|
||||||
expect(mapping).to end_with(DockerClient::CONTAINER_WORKSPACE_PATH)
|
expect(mapping).to end_with(DockerClient::CONTAINER_WORKSPACE_PATH)
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user