Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在docker机器中装载本地卷_Docker_Dockerfile_Docker Compose - Fatal编程技术网

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

如何在docker机器中装载本地卷,docker,dockerfile,docker-compose,Docker,Dockerfile,Docker Compose,我正在尝试使用docker编写的docker机器。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时,一切正常,直到尝试执行命令并产生错误: 无法

我正在尝试使用docker编写的docker机器。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
时,一切正常,直到尝试执行命令并产生错误:

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


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

我假设
run\u web.sh
文件与您的
docker compose.yml
文件位于同一目录中。然后命令应该是
command:/app/run\u web.sh


除非
Dockerfile
(您没有透露)负责将
run\u web.sh
文件放入Docker映像。

也遇到此问题,并且在使用Docker机器时似乎没有装入本地卷。黑客解决方案是

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

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

    rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:<result _of_pwd_from_1>.
    
    rsync-avzhe-ssh——进度username@remote_ip:.
    
  • 默认的pwd是/root,因此上面的命令应该是
    rsync-avzhe-ssh--progressusername@remote_ip:/root

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

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

  • 运行
    docker compose up-d

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

    这不是完美的,但很有效。一个问题正在发生


    另一个试图解决这个问题的项目包括

    ,目前我真的看不到在机器上装载卷的任何方法,所以现在的方法是以某种方式将需要的文件复制或同步到机器中

    关于如何在docker机器的github repo上解决这个问题,有很多讨论。有人在docker机器上做了一个实现,它已经在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
    
    更新:进一步查看,我发现该功能已在中可用,当您获得它们时,您将能够运行以下命令复制您的本地项目:

    docker-machine scp -r . dev:/home/docker/project
    
    作为一般形式:

    docker-machine scp [machine:][path] [machine:][path]
    
    因此,您可以在计算机之间复制文件


    干杯!1

    Docker机器自动装载用户目录。。。但有时这还不够

    我不知道docker 1.6,但在1.8中,您可以向docker机器添加额外的挂载

    添加虚拟机装载点(第1部分) CLI:(仅在机器停止时工作)

    vboxmanagesharedfolderadd--name--hostpath--automount

    因此,windows中的一个示例是

    /c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe sharedfolder add default --name e --hostpath 'e:\' --automount
    
    GUI:(不需要停止机器)

  • 启动“Oracle VM VirtualBox管理器”
  • 右键单击
    (默认)
  • 设置
  • 共享文件夹
  • 右侧的文件夹+图标(添加共享)
  • 文件夹路径:
    (e:)
  • 文件夹名称:
    (e)
  • 检查“自动挂载”和“永久挂载”(如果需要,请只读…(当前自动挂载有点毫无意义…)
  • 在boot2docker中安装(第2部分) 在boot2docker中手动装入:

  • 有多种方法可以登录,在“Oracle VM VirtualBox Manager”中使用“Show”,或通过IP地址将ssh/putty插入docker
    docker机器IP默认值
    ,等等
  • sudo mkdir-p
  • sudo mount-t vboxsf-o默认值,uid=`id-u docker`,gid=`id-g docker`
  • 但这只有在你重新启动机器,然后挂载丢失之前是好的

    将自动装载添加到boot2docker

    登录到计算机时

  • 编辑/创建(作为根用户)
    /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>
    
    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>
    
  • 作为最后的选择,您可以选择稍微繁琐一点的替代方案,只需修改引导映像即可

    • git-c core.autocrlf=false克隆https://github.com/boot2docker/boot2docker.git
    • cd boot2docker
    • git-c core.autocrlf=false checkout v1.8.1或相应版本
    • 编辑
      rootfs/etc/rc.d/automount共享
    • 在末尾的fi前面添加
      try\u mount\u share
      行。比如说

      try_mount_share /e e
      
      请确保不要将设置为操作系统需要的任何内容,如/bin等

    • docker build-t boot2docker.
      #第一次大约需要一个小时:(
    • docker运行--rm boot2docker>boot2docker.iso
    • 备份旧的boot2docker.iso并在~/.docker/machine/machines中复制新的boot2docker.iso/
    这确实管用,只是又长又复杂


    docker版本1.8.1,docker机器版本0.4.0

    在此总结文章后,附加更新脚本,以创建附加主机装载点并在Virtualbox重新启动时自动装载。工作环境简述如下: -视窗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'
    

    如果在docker machine中选择rsync选项,则可以将其与
    docker machine ssh
    命令结合使用,如下所示:

    docker-machine scp -r . dev:/home/docker/project
    
    rsync-rvz--rsh='docker-machine-ssh'--进度:

    It u
    inotifywait -r -m -e close_write --format '%w%f' /home/jdcaballerov/web | while read CHANGED_FILE
    do
        rsync /home/jdcaballerov/web /tmp/some_random_dir
    done