首页 文章

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

提问于
浏览
75

我正在尝试使用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

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

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

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

10 回答

  • 0

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

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

    • 使用命令行工具(如 rsync )将文件夹复制到远程系统

    rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:<result _of_pwd_from_1>.
    

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

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

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

    • 运行 docker-compose up -d

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

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

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

  • 2

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

    我不知道docker 1.6,但在1.8中你可以为docker-machine添加一个额外的mount

    添加虚拟机挂载点(第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
    

    GUI :(不要求机器停止)

    • 开始"Oracle VM VirtualBox Manager"

    • 右键单击 <machine name> (默认)

    • 设置......

    • 共享文件夹

    • 右侧的文件夹图标(添加共享)

    • 文件夹路径: <host dir> (e :)

    • 文件夹名称: <mount name> (e)

    • 检查"Auto-mount"和"Make Permanent"(只读,如果你想......)(自动装载目前有点无意义......)

    在boot2docker中挂载(第2部分)

    Manually mount in boot2docker

    • 有多种方法可以登录,使用"Oracle VM VirtualBox Manager"中的"Show",或者通过IP地址 docker-machine ip default 等将ssh / putty用于docker ...

    • sudo mkdir -p <local_dir>

    • sudo mount -t vboxsf -o defaults,uid=id -u docker,gid=id -g docker<mount_name> <local_dir>

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

    Adding an automount to boot2docker

    登录机器时

    • 编辑/创建(以root用户身份) /mnt/sda1/var/lib/boot2docker/bootlocal.sh ,sda1可能与您有所不同......

    • 添加

    mkdir -p <local_dir>
    mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
    

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


    旧方法: Less recommended ,但作为替代

    • 编辑(以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>
    

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

    • 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

    • 在最后的fi之前添加 try_mount_share <local_dir> <mount_name> 行 . 例如

    try_mount_share /e e
    

    请确保不要设置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

  • 0

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

    关于如何在docker-machine的github repo上解决这个问题有conversations . 有人在docker-machine上实现了pull request pull request,并且's already merged on master, so it'很可能下一个版本将包含它 .

    由于它尚未发布,现在我建议如果您的代码托管在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
    

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

    docker-machine scp -r . dev:/home/docker/project
    

    这是一般形式:

    docker-machine scp [machine:][path] [machine:][path]
    

    所以你可以复制文件从机器到机器之间 .

    干杯!1

  • 24

    如果您使用docker-machine选择rsync选项,则可以将其与 docker-machine ssh <machinename> 命令组合使用,如下所示:

    rsync -rvz --rsh='docker-machine ssh <machinename>' --progress <local_directory_to_sync_to> :<host_directory_to_sync_to>

    它使用rsync的这种命令格式,留下 HOST 空白:

    rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

    http://linuxcommand.org/man_pages/rsync1.html

  • 4

    自2017年10月以来,有一个针对docker-machine的新命令可以完成这项工作,但确保在执行之前目录中没有任何内容,否则它可能会丢失:

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

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

    公关改变:https://github.com/docker/machine/pull/4018

  • 0

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

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

  • 0

    在此处汇总帖子后,附加更新的脚本,以在Virtualbox重新启动时创建其他主机挂载点和自动挂载 . 工作环境简述如下: - Windows 7 - docker-machine.exe版本0.7.0 - VirtualBox 5.0.22

    #!env bash
    
        : ${NAME:=default}
        : ${SHARE:=c/Proj}
        : ${MOUNT:=/c/Proj}
        : ${VBOXMGR:=C:\Program Files\Oracle\VirtualBox\VBoxManage.exe}
        SCRIPT=/mnt/sda1/var/lib/boot2docker/bootlocal.sh
    
        ## set -x
        docker-machine stop $NAME
        "$VBOXMGR" sharedfolder add $NAME --name c/Proj --hostpath 'c:\' --automount 2>/dev/null || :
        docker-machine start $NAME
        docker-machine env $NAME
    
        docker-machine ssh $NAME 'echo "mkdir -p $MOUNT" | sudo tee $SCRIPT'
        docker-machine ssh $NAME 'echo "sudo mount -t vboxsf -o rw,user $SHARE $MOUNT" |  sudo tee -a $SCRIPT'
        docker-machine ssh $NAME 'sudo chmod +x /mnt/sda1/var/lib/boot2docker/bootlocal.sh'
        docker-machine ssh $NAME 'sudo /mnt/sda1/var/lib/boot2docker/bootlocal.sh'
        #docker-machine ssh $NAME 'ls $MOUNT'
    
  • 89

    最后想出了如何将Windows Docker Toolbox升级到v1.12.5并通过在 Oracle VM VirtualBox manager中添加共享文件夹并禁用路径转换来保持我的卷正常工作 . 如果你有Windows 10,那么你最好使用较新的Docker for Windows .

    1st the upgrade Pain:

    • 首先卸载VirtualBox .

    • 是的,这可能会破坏Android Studio等其他工具的内容 . 谢谢Docker :(

    • 安装新版本的Docker Toolbox .

    Redis Database Example: redis: image: redis:alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"

    在Docker快速启动终端....

    • run docker-machine stop default - 确保VM受到攻击

    在Oracle VM VirtualBox Manager中......

    • 通过或命令行在 default VM中添加了共享文件夹

    • D:\Projects\MyProject\db => /var/db

    docker-compose.yml ...

    • 映射的redis卷为: "/var/db/redis:/data:rw"

    在Docker快速启动终端....

    • 设置 COMPOSE_CONVERT_WINDOWS_PATHS=0 (对于Toolbox版本> = 1.9.0)

    • 运行 docker-machine start default 以重新启动VM .

    • cd D:\Projects\MyProject\

    • docker-compose up 现在应该工作了 .

    现在在 D:\Projects\MyProject\db\redis\dump.rdb 中创建redis数据库

    Why avoid relative host paths?

    我避免了Windows Toolbox的相对主机路径,因为它们可能会引入无效的''字符 . 它不如使用相对于 docker-compose.yml 的路径那么好,但至少我的开发人员可以很容易地做到这一点,即使他们的项目文件夹在别处而不必破解 docker-compose.yml 文件(对SCM不好) .

    Original Issue

    仅供参考...这是我使用漂亮干净的相对路径时得到的原始错误,这些路径过去常用于旧版本 . 我的卷映射曾经只是 "./db/redis:/data:rw"

    ERROR: for redis Cannot create container for service redis: Invalid bind mount spec "D:\\Projects\\MyProject\\db\\redis:/data:rw": Invalid volume specification: 'D:\Projects\MyProject\db\redis:/data

    这打破了两个原因..

    • 无法访问 D: 驱动器

    • 卷路径不能包含 \ 个字符

    • docker-compose 添加它们然后责怪你!

    • 使用 COMPOSE_CONVERT_WINDOWS_PATHS=0 来阻止这种废话 .

    我建议您在 docker-compose.yml 文件中记录其他VM共享文件夹映射,因为您可能需要再次卸载VirtualBox并重置共享文件夹,无论如何,您的伙伴开发人员都会喜欢它 .

  • 0

    我在我的本地机器上使用docker-machine 0.12.2和virtualbox驱动器 . 我发现有一个目录 /hosthome/$(user name) ,您可以从中访问本地文件 .

  • 14

    刚想到我提到我在Windows 10上一直使用18.03.1-ce-win65(17513)而且我注意到如果你之前共享过一个驱动器并缓存了凭据,一旦你更改密码,docker就会开始拥有容器中安装的卷为空白 .

    它没有表明实际发生的事情是它现在无法使用旧的缓存凭据访问共享 . 此方案中的解决方案是通过UI(设置 - >共享驱动器)重置凭据,或者禁用然后可重命名的驱动器共享并输入新密码 .

    如果docker-compose在这些情况下出错,那将会很有用 .

相关问题