繁体   English   中英

使用预编译文件在 Docker 容器之间共享文件夹

[英]Sharing a folder between Docker-Containers with precompiled files

我使用 Github Actions 来制作一个带有 Laravel 的 php-fpm Docker 容器和预编译的 ZC5FD214CDD0D2B3BB42 文件中的 ZC5FD214CDD0D2B3BC27 文件。 CSS 和 JS 文件是用 npm 制作的。 这个 Docker 容器被推送到我的 Docker Regestry。

我想检查这个容器并让它运行 Docker-Compose 和一个 nginx 容器运行这个配置:

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

所以 PHP 部分运行完美,但是 CSS 和 JS 部分不工作,因为 app Container 有这个文件。 我如何在这两个容器之间复制、共享或其他内容?

您不能从主机中放入卷,因为卷将只包含主机上的内容,而不是容器中的内容……它必须指向另一个方向。

您应该使用完全符合您需求的命名卷

volumes:
  assets:

services:
  nginx:
    ...
    volumes:
      - assets:/var/www/public/:ro

  app:
    ...
    volumes:
      - assets:/your/npm/output/folder

您的 JS/CSS 文件将在您的 2 个容器之间正确共享

您必须在 docker 构建时定义 docker 卷,然后设置您的预编译文件,然后将此命名卷安装到两个系统。

问题是您正在尝试安装已经在 docker 映像中的东西,而不是 docker 卷。 在 docker 运行时没有办法做到这一点。 那不是哲学。

总之,你正在做(错误地):

  1. 使用/your_dir中的预编译文件创建docker build image1
  2. 正如你所说的,你不能从你的主机上挂载一个目录到docker-image1:/your_dir因为它会覆盖它。
  3. docker-image2docker-image1没有优雅的访问方式。

好习惯:

  1. 例如,创建 docker NAMED 卷,称为myvolume
  2. 创建docker build image1 ,它将您的预编译保存在myvolume
  3. 创建容器docker run -t image1... yourCssDocker安装myvolume
  4. 创建容器docker run -t image2... yourNginxDocker ,挂载myvolume

这就是继续的方式。 请注意,您应该通过其名称访问myvolume ,而不是通过绑定卷(主机路径)。

您可以仅使用 1 个 docker-compose.yml 文件(使用名为 docker 卷名的 css-precomp )完成所有步骤(来自良好实践的 4 个)

volumes:
  css-precomp:

services:
  my-service:
    build:
      - context: .
      - dockerfile: Dockerfile
    volumes:
      - css-precomp:/your_dir
    ...

最后,您可以在 Dockerfile 中构建后检查您的数据是否正确生成,检查/var/lib/docker/volumes/css-precomp/_data

Dockerfile COPY指令允许您将文件从一个图像复制到另一个图像。 如果您已经构建了 PHP 应用程序映像,则可以使用 static 文件构建 nginx 映像,例如:

FROM nginx:latest
COPY --from=my/php-app /usr/src/app /usr/share/nginx/html
COPY nginx.conf /etc/nginx

您现在将拥有两个独立的图像。 如果 PHP 映像中的内容发生更改,那么您可以重建 nginx 映像以获取更新的内容。 (如果您按照其他问题的建议使用命名卷,则必须手动删除包含 static 资产的卷以更新其内容。)此设置也适用于更高级的设置,其中每个组件可能运行多个副本不同的系统(Docker Swarm、Amazon ECS、Kubernetes)。

如果可以直接从后端服务提供 static 资产,并仅将 nginx 用作反向代理,则可以显着简化此部署顺序。 但是,使用 PHP-FPM 设置可能无法做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM