如何在docker机器中安装本地卷

jdc*_*rov 81 docker dockerfile docker-compose

我正在尝试使用docker-machine与docker-compose.docker-compose.yml文件的定义如下:

web:
  build: .
  command: ./run_web.sh
  volumes:
    - .:/app
  ports:
    - "8000:8000"
  links:
    - db:db
    - rabbitmq:rabbit
    - redis:redis
Run Code Online (Sandbox Code Playgroud)

当运行docker-compose up -d一切顺利,直到尝试执行命令并产生错误:

无法启动容器b58e2dfa503b696417c1c3f49e2714086d4e9999bd71915a53502cb6ef43936d:[8]系统错误:exec:"./ run_web.sh":stat ./run_web.sh:没有这样的文件或目录

本地卷未安装到远程计算机.什么是使用webapps代码挂载本地卷的推荐策略?

And*_*ndy 92

Docker-machine自动挂载用户目录......但有时这还不够.

我不知道泊坞窗1.6,但在1.8你CAN添加一个额外的安装到泊坞窗机

添加虚拟机挂载点(第1部分)

CLI :(仅在机器停止时有效)

VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <host_dir> --automount

所以Windows中的一个例子就是

/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe sharedfolder add default --name e --hostpath 'e:\' --automount
Run Code Online (Sandbox Code Playgroud)

GUI :(不要求机器停止)

  1. 启动"Oracle VM VirtualBox Manager"
  2. 右键单击<machine name>(默认)
  3. 设置...
  4. 共享文件夹
  5. 右侧的文件夹+图标(添加共享)
  6. 文件夹路径:<host dir>(e :)
  7. 文件夹名称:<mount name>(e)
  8. 检查"自动安装"和"永久安装"(只读,如果你想......)(自动安装目前有点无意义......)

在boot2docker中安装(第2部分)

手动挂载在boot2docker中:

  1. 有多种方式可以登录,在"Oracle VM VirtualBox Manager"中使用"Show",或者通过IP地址使用ssh/putty到docker docker-machine ip default等...
  2. sudo mkdir -p <local_dir>
  3. sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>

但这只有在你重新启动机器,然后安装丢失之后才有用......

将自动挂载添加到boot2docker:

登录机器时

  1. 编辑/创建(以root身份)/mnt/sda1/var/lib/boot2docker/bootlocal.sh,sda1可能与您不同...
  2. mkdir -p <local_dir>
    mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
    
    Run Code Online (Sandbox Code Playgroud)

通过这些更改,您应该有一个新的挂载点.这是我能找到的少数几个在启动时调用的文件之一,并且是持久的.在有更好的解决方案之前,这应该有效.


旧方法:少推荐,但作为替代方案

  • 编辑(以root身份)/mnt/sda1/var/lib/boot2docker/profile,sda1可能与您不同...
  • add_mount() {
      if ! grep -q "try_mount_share $1 $2" /etc/rc.d/automount-shares ; then
        echo "try_mount_share $1 $2" >> /etc/rc.d/automount-shares
      fi
    }
    
    add_mount <local dir> <mount name>
    
    Run Code Online (Sandbox Code Playgroud)

作为最后的手段,您可以采用稍微繁琐的替代方案,您只需修改启动映像即可.

  • git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.git
  • cd boot2docker
  • git -c core.autocrlf=false checkout v1.8.1 #或您的合适版本
  • 编辑 rootfs/etc/rc.d/automount-shares
  • try_mount_share <local_dir> <mount_name>最后在fi之前添加一行.例如

    try_mount_share /e e
    
    Run Code Online (Sandbox Code Playgroud)

    请确保不要设置os需要的任何内容,例如/ bin等...

  • docker build -t boot2docker . #这将是第一次约一个小时:(
  • docker run --rm boot2docker > boot2docker.iso
  • 备份旧的boot2docker.iso并将其复制到其位置~~ .docker/machine/machines /

这确实有效,它只是漫长而复杂

docker version 1.8.1,docker-machine version 0.4.0

  • 为此处提到的解决方案创建了一个脚本.适用于最新的docker 1.10和docker-machine 0.6.0 gist.github.com/cristobal/fcb0987871d7e1f7449e (3认同)

gbo*_*zee 26

还遇到了这个问题,看起来使用docker-machine时没有挂载本地卷.黑客解决方案是

  1. 获取docker-machine实例的当前工作目录 docker-machine ssh <name> pwd

  2. 使用命令行工具rsync将文件夹复制到远程系统

    rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:<result _of_pwd_from_1>.
    
    Run Code Online (Sandbox Code Playgroud)

默认的pwd是/ root所以上面的命令就是 rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root

注意:您需要提供远程系统的密码.您可以通过ssh快速创建一个到远程系统并创建密码.

  1. docker-compose.yml文件中的卷装入点更改.:/app/root/<name_of_folder>:/app

  2. docker-compose up -d

注意当在本地进行更改时,不要忘记重新运行rsync以将更改推送到远程系统.

它不完美,但它的工作原理.一个问题正在进行中https://github.com/docker/machine/issues/179

尝试解决此问题的其他项目包括docker-rsync


cla*_*ort 14

目前我无法真正看到在机器上安装卷的任何方法,因此现在的方法是以某种方式将您需要的文件复制或同步到机器中.

交谈关于如何解决在泊坞窗机的GitHub库这个问题.有人在docker-machine上发出了一个执行scppull请求,它已经在master上合并了,所以下一个版本很可能会包含它.

由于它尚未发布,现在我建议如果您的代码托管在github上,只需在运行应用程序之前克隆您的repo

web:
  build: .
  command: git clone https://github.com/my/repo.git; ./repo/run_web.sh
  volumes:
    - .:/app
  ports:
    - "8000:8000"
  links:
    - db:db
    - rabbitmq:rabbit
    - redis:redis
Run Code Online (Sandbox Code Playgroud)

更新:进一步观察我发现该功能已经在最新的二进制文件中可用,当你获得它们时,你将能够复制运行如下命令的本地项目:

docker-machine scp -r . dev:/home/docker/project
Run Code Online (Sandbox Code Playgroud)

这是一般形式:

docker-machine scp [machine:][path] [machine:][path]
Run Code Online (Sandbox Code Playgroud)

因此,您可以从机器复制文件,在机器之间复制文件.

干杯!1

  • 这个方法很慢:( (2认同)

Jor*_*rge 5

自 2017 年 10 月以来,docker-machine 有一个新命令可以解决这个问题,但在执行之前请确保目录中没有任何内容,否则可能会丢失:

docker-machine mount <machine-name>:<guest-path> <host-path>

查看文档以获取更多信息:https : //docs.docker.com/machine/reference/mount/

PR 与更改:https : //github.com/docker/machine/pull/4018


Tho*_*eil 0

我假设该run_web.sh文件与您的文件位于同一目录中docker-compose.yml。那么命令应该是command: /app/run_web.sh.

除非Dockerfile(您没有透露)负责将run_web.sh文件放入 Docker 镜像中。