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添加一个额外的安装到泊坞窗机
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 :(不要求机器停止)
<machine name>
(默认)<host dir>
(e :)<mount name>
(e)手动挂载在boot2docker中:
docker-machine ip default
等...sudo mkdir -p <local_dir>
sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
但这只有在你重新启动机器,然后安装丢失之后才有用......
将自动挂载添加到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>
Run Code Online (Sandbox Code Playgroud)通过这些更改,您应该有一个新的挂载点.这是我能找到的少数几个在启动时调用的文件之一,并且是持久的.在有更好的解决方案之前,这应该有效.
旧方法:少推荐,但作为替代方案
/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
这确实有效,它只是漫长而复杂
docker version 1.8.1,docker-machine version 0.4.0
gbo*_*zee 26
还遇到了这个问题,看起来使用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>.
Run Code Online (Sandbox Code Playgroud)默认的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
cla*_*ort 14
目前我无法真正看到在机器上安装卷的任何方法,因此现在的方法是以某种方式将您需要的文件复制或同步到机器中.
有交谈关于如何解决在泊坞窗机的GitHub库这个问题.有人在docker-machine上发出了一个执行scp的pull请求,它已经在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
自 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
我假设该run_web.sh
文件与您的文件位于同一目录中docker-compose.yml
。那么命令应该是command: /app/run_web.sh
.
除非Dockerfile
(您没有透露)负责将run_web.sh
文件放入 Docker 镜像中。
归档时间: |
|
查看次数: |
63398 次 |
最近记录: |