使用docker-compose和自定义Dockerfile的挂载目录为空

时间:2019-09-28 17:08:24

标签: docker docker-compose dockerfile

我是Docker的新手,所以尝试一下。我创建了一个非常基本的Dockerfile来拉入Laravel:

FROM composer:latest
RUN composer_version="$(composer --version)" && echo $composer_version
RUN composer global require laravel/installer
WORKDIR /var/www
RUN composer create-project --prefer-dist laravel/laravel site

我的docker-compose.yml文件如下:

version: '3.7'

services:

    laravel:
        build:
            context: .
            dockerfile: laravel.dockerfile
        container_name: my_laravel
        network_mode: host
        restart: on-failure
        volumes:
            - ./site:/var/www/site

当我运行docker-compose up时,创建了./site目录,但是内容为空。我将其放在docker-compose中,以计划包括Nginx,mysql,php等其他内容

命令:

docker run -v "/where/i/want/data/site:/var/www/site" my_laravel

产生相同的行为。

我知道安装成功,因为我修改了dockerfile并添加了以下两行:

WORKDIR /var/www/site
RUN ls -la

哪个给我正确的清单。

在这里显然有误会。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

编辑: 因此,我能够使它工作……尽管,这比仅指定路径要困难一些。

您可以通过在docker-compose.yml中指定一个卷来完成此操作。目录(在主机上)的路径在撰写文件中被标记为device。路径必须是实际的卷(可能可以共享),但是路径的“目标”可以是指定卷上的目录。

我在计算机上创建了一个名为docker的新卷,但是我想您可以使用现有的磁盘/卷来完成此操作。

我在Mac上,此docker-compose.yml文件对我有用:

version: '3.7'
services:
  nodemon-test:
    container_name: my-nodemon-test
    image: oze4/nodemon-docker-test
    ports:
      - "1337:1337"
    volumes:
      - docker_test_app:/app    # see comment below on which name to use here

volumes:
  docker_test_app:              # use this name under `volumes:` for the service
    name: docker_test_app
    driver: local
    driver_opts:
       o: bind
       type: none
       device: /Volumes/docker/docker_test_app

指定的容器存在于我的DockerHub中。为此this is the source code,以防万一您担心任何恶意的情况。我像两个星期前一样在help someone else on StackOverflow上创建了它。


显示我机器(主机)上容器中的文件。

enter image description here


如果愿意,您可以阅读有关Docker Volume配置here的更多信息。


原始答案:

似乎您正在尝试与主机共享构建目录。经过一些测试,看来Docker将用主机上路径的内容覆盖容器上的指定路径。

如果运行docker logs my_laravel,应该会在/var/www/site上看到有关文件丢失的错误。.因此,即使构建成功,一旦Docker从您的机器上挂载目录(./site )移至容器(/var/www/site)上,它会用主机(/var/www/site)上路径的内容覆盖容器(./site)中的路径-空。

要测试并确保/var/www/site的内容确实被覆盖,可以运行docker exec -it /bin/bash(您可能需要将/bin/bash替换为/bash)。这将使您可以在容器的内部进行命令行访问。从那里您可以ls -a /var/www/site ..

此外,您还可以预先准备./site以便在其中放入随机测试文件(test.txt或其他任何文件),然后docker-compose up -d,然后从上面的步骤中运行相同的命令docker exec -it ...并查看暂存的test.txt文件是否现在位于容器内-这为您提供了确凿的证据,证明您在运行volumes时,主机上的数据会覆盖容器中的数据。

话虽如此,doing something like this和共享日志目录将起作用...容器上指定的卷路径仍被覆盖,不同之处在于容器正在写入该路径。依靠它来获取配置文件/应用文件。

希望这会有所帮助。