我是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
哪个给我正确的清单。
在这里显然有误会。任何帮助表示赞赏。
答案 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上创建了它。
显示我机器(主机)上容器中的文件。
如果愿意,您可以阅读有关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和共享日志目录将起作用...容器上指定的卷路径仍被覆盖,不同之处在于容器正在写入该路径。依靠它来获取配置文件/应用文件。
希望这会有所帮助。