kopia lustrzana https://github.com/jupyterhub/repo2docker
Add support for relative paths in the volume destination too
rodzic
6227cf14fe
commit
988f9dded8
|
@ -109,7 +109,10 @@ class Repo2Docker(Application):
|
||||||
Only used when running, not during build!
|
Only used when running, not during build!
|
||||||
|
|
||||||
Should be a key value pair, with the key being the volume source &
|
Should be a key value pair, with the key being the volume source &
|
||||||
value being the destination.
|
value being the destination. Both can be relative - sources are
|
||||||
|
resolved relative to the current working directory on the host,
|
||||||
|
destination is resolved relative to the working directory of the image -
|
||||||
|
($HOME by default)
|
||||||
""",
|
""",
|
||||||
config=True
|
config=True
|
||||||
)
|
)
|
||||||
|
@ -331,6 +334,8 @@ class Repo2Docker(Application):
|
||||||
|
|
||||||
def run_image(self):
|
def run_image(self):
|
||||||
client = docker.from_env(version='auto')
|
client = docker.from_env(version='auto')
|
||||||
|
api_client = docker.APIClient(version='auto',
|
||||||
|
**docker.utils.kwargs_from_env())
|
||||||
port = self._get_free_port()
|
port = self._get_free_port()
|
||||||
if not self.run_cmd:
|
if not self.run_cmd:
|
||||||
port = str(self._get_free_port())
|
port = str(self._get_free_port())
|
||||||
|
@ -340,16 +345,23 @@ class Repo2Docker(Application):
|
||||||
else:
|
else:
|
||||||
run_cmd = self.run_cmd
|
run_cmd = self.run_cmd
|
||||||
ports = {}
|
ports = {}
|
||||||
volumes = {
|
container_volumes = {}
|
||||||
os.path.abspath(k): { 'bind': v, 'mode': 'rw'}
|
if self.volumes:
|
||||||
for k, v in self.volumes.items()
|
image = api_client.inspect_image(self.output_image_spec)
|
||||||
|
image_workdir = image['ContainerConfig']['WorkingDir']
|
||||||
|
|
||||||
|
for k, v in self.volumes.items():
|
||||||
|
container_volumes[os.path.abspath(k)] = {
|
||||||
|
'bind': v if v.startswith('/') else os.path.join(image_workdir, v),
|
||||||
|
'mode': 'rw'
|
||||||
}
|
}
|
||||||
|
|
||||||
container = client.containers.run(
|
container = client.containers.run(
|
||||||
self.output_image_spec,
|
self.output_image_spec,
|
||||||
ports=ports,
|
ports=ports,
|
||||||
detach=True,
|
detach=True,
|
||||||
command=run_cmd,
|
command=run_cmd,
|
||||||
volumes=volumes
|
volumes=container_volumes
|
||||||
)
|
)
|
||||||
while container.status == 'created':
|
while container.status == 'created':
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
|
@ -6,9 +6,9 @@ import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
|
|
||||||
def test_volume_home():
|
def test_volume_abspath():
|
||||||
"""
|
"""
|
||||||
Validate that you can bind mount a volume onto homedirectory & write to it
|
Validate that you can bind mount a volume onto an absolute dir & write to it
|
||||||
"""
|
"""
|
||||||
ts = str(time.time())
|
ts = str(time.time())
|
||||||
with tempfile.TemporaryDirectory() as tmpdir:
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||||||
|
@ -23,3 +23,27 @@ def test_volume_home():
|
||||||
|
|
||||||
with open(os.path.join(tmpdir, 'ts')) as f:
|
with open(os.path.join(tmpdir, 'ts')) as f:
|
||||||
assert f.read() == ts
|
assert f.read() == ts
|
||||||
|
|
||||||
|
|
||||||
|
def test_volume_relpath():
|
||||||
|
"""
|
||||||
|
Validate that you can bind mount a volume onto an relative path & write to it
|
||||||
|
"""
|
||||||
|
curdir = os.getcwd()
|
||||||
|
try:
|
||||||
|
ts = str(time.time())
|
||||||
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||||||
|
os.chdir(tmpdir)
|
||||||
|
subprocess.check_call([
|
||||||
|
'repo2docker',
|
||||||
|
'-v', '.:.',
|
||||||
|
tmpdir,
|
||||||
|
'--',
|
||||||
|
'/bin/bash',
|
||||||
|
'-c', 'echo -n {} > ts'.format(ts)
|
||||||
|
])
|
||||||
|
|
||||||
|
with open(os.path.join(tmpdir, 'ts')) as f:
|
||||||
|
assert f.read() == ts
|
||||||
|
finally:
|
||||||
|
os.chdir(curdir)
|
||||||
|
|
Ładowanie…
Reference in New Issue