使用docker-compose如何在容器和宿主机之间同步代码?

15

到目前为止,我一直使用本地的LAMP堆栈来开发我的Web项目,并手动将其部署到服务器上。对于下一个项目,我想使用Docker和Docker-compose创建一个MariaDB、NGINX和一个项目容器,以便轻松进行开发和部署。

在开发过程中,我希望宿主机上的代码目录与Docker容器同步。我知道可以通过运行以下命令来实现:

docker run -dt --name containerName -v /path/on/host:/path/in/container

此处所述,在cli中可以共享文件,但我想在docker-compose v2文件中实现。

目前我的docker-compose.yml文件看起来是这样的:

version: '2'

services:
    db:
        #[...]
    myProj:
        build: ./myProj
        image: myProj
        depends_on:
            - db
        volumes:
            myCodeVolume:/var/www
volumes:
    myCodeVolume:

我该如何将容器中的/var/www目录与我的主机(Ubuntu桌面版、macOS或Windows计算机)同步?

谢谢您的帮助。


只是检查一下,你写成了 docker-composer.yml 而不是 docker-compose.yml。不确定这是否是一个笔误(如果你真的运行前者,其他东西可能无法正常工作),但我想检查一下。 - metasoarous
1个回答

11

在compose文件中,您可以直接在services.myProj.volumes键下完成host:container映射:

version: '2'
services:
    ...
    myProj:
        ...
        volumes:
            /path/to/file/on/host:/var/www

请注意:顶级volumes键已被删除。

这个文件可以翻译成:

docker create --links db -v /path/to/file/on/host:/var/www myProj

docker-compose 发现顶层的 volumes 部分时,它会首先尝试使用 docker volume create 创建其下的键,然后再创建任何其他容器。这些卷可以用来保存您想要在容器间保持持久性的数据。

因此,以您的文件为例,它将转换成这样:

docker volume create myCodeVolume
docker create --links db -v myCodeVoume:/var/www myProj

1
谢谢!如果我理解正确的话,我可以使用顶层卷来在容器之间共享文件,并使用内部服务卷来进行容器主机共享? - pBuch
是的。但为了完整回答,内部服务卷仍可以与通过CLI相同的方式使用 :) - Ayman Nedjmeddine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接