shopware/docker

Shopware 6生产环境的Docker镜像

安装次数: 13,388

依赖关系: 0

建议者: 0

安全性: 0

星标: 34

关注者: 9

分支: 12

开放性问题: 2

语言:Shell

类型:元包

0.1.1 2024-08-02 09:38 UTC

This package is auto-updated.

Last update: 2024-09-16 11:15:41 UTC


README

此存储库包含一个基于Alpine + PHP + Caddy的基础镜像,您可以使用它来构建包含您的代码的Docker镜像。

注意

此Docker镜像期望您使用Composer安装所有扩展。否则,您将收到“找不到类X”的错误。请参阅更多详细信息

入门

在您的项目中创建一个Dockerfile,例如

#syntax=docker/dockerfile:1.4

# pin versions
FROM ghcr.io/shopware/docker-base:8.2 as base-image
FROM ghcr.io/friendsofshopware/shopware-cli:latest-php-8.2 as shopware-cli

# build

FROM shopware-cli as build

COPY --link . /src
WORKDIR /src

RUN --mount=type=secret,id=composer_auth,dst=/src/auth.json \
    --mount=type=cache,target=/root/.composer \
    --mount=type=cache,target=/root/.npm \
    /usr/local/bin/entrypoint.sh shopware-cli project ci /src

# build final image

FROM base-image

COPY --from=build --chown=www-data /src /var/www/html

或者更好的方法是运行composer req shopware/docker来安装Symfony配方。

build阶段,我们使用shopware-cli来构建Shopware文件

  • Composer安装
  • 根据需要构建带有扩展的 Administration 和 Storefront
  • 移除一些vendor文件以使层更小
  • 将管理片段合并到一个文件中

有关更多关于shopware-cli project ci的信息,请参阅shopware-cli

构建Docker镜像

您可以在CI管道中使用源代码构建您的个人Docker镜像并将其推送到容器注册库。稍后,您可以在示例docker-compose / kubernetes /等中使用此镜像。

构建镜像的示例Github Action
name: Build Docker Image

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
        
      - name: Login into Github Docker Registery
        run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./docker/Dockerfile
          push: true
          tags: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}

运行容器

示例docker-compose

注意以下配置不共享var/log或var/cache。对于缓存,您应该考虑使用Redis,并将日志转发到stderr,以便它们在容器日志中。

version: "3.8"
services:
    db:
        image: mysql:8.0
        environment:
            MYSQL_ROOT_PASSWORD: 'shopware'
            MYSQL_USER: shopware
            MYSQL_PASSWORD: shopware
            MYSQL_DATABASE: shopware
        volumes:
        - mysql-data:/var/lib/mysql

    init-perm:
        image: alpine
        volumes:
            - files:/var/www/html/files
            - theme:/var/www/html/public/theme
            - media:/var/www/html/public/media
            - thumbnail:/var/www/html/public/thumbnail
            - sitemap:/var/www/html/public/sitemap
        command: chown 82:82 /var/www/html/files /var/www/html/public/theme /var/www/html/public/media /var/www/html/public/thumbnail /var/www/html/public/sitemap

    init:
        image: local
        build:
            context: .
        env_file: .app.env
        entrypoint: /setup
        volumes:
            - files:/var/www/html/files
            - theme:/var/www/html/public/theme
            - media:/var/www/html/public/media
            - thumbnail:/var/www/html/public/thumbnail
            - sitemap:/var/www/html/public/sitemap
        depends_on:
            db:
                condition: service_started
            init-perm:
                condition: service_completed_successfully
    web:
        image: local
        build:
            context: .
        volumes:
            - files:/var/www/html/files
            - theme:/var/www/html/public/theme
            - media:/var/www/html/public/media
            - thumbnail:/var/www/html/public/thumbnail
            - sitemap:/var/www/html/public/sitemap
        depends_on:
            init:
                condition: service_completed_successfully
        env_file: .app.env
        ports:
            - 8000:8000

    worker:
        image: local
        restart: unless-stopped
        build:
            context: .
        volumes:
            - files:/var/www/html/files
            - theme:/var/www/html/public/theme
            - media:/var/www/html/public/media
            - thumbnail:/var/www/html/public/thumbnail
            - sitemap:/var/www/html/public/sitemap
        depends_on:
            init:
                condition: service_completed_successfully
        env_file: .app.env
        entrypoint: [ "php", "bin/console", "messenger:consume", "async", "low_priority", "--time-limit=300", "--memory-limit=512M" ]
        deploy:
            replicas: 3

    scheduler:
        image: local
        restart: unless-stopped
        build:
            context: .
        volumes:
            - files:/var/www/html/files
            - theme:/var/www/html/public/theme
            - media:/var/www/html/public/media
            - thumbnail:/var/www/html/public/thumbnail
            - sitemap:/var/www/html/public/sitemap
        depends_on:
            init:
                condition: service_completed_successfully
        env_file: .app.env
        entrypoint: [ "php", "bin/console", "scheduled-task:run" ]

volumes:
    mysql-data:
    files:
    theme:
    media:
    thumbnail:
    sitemap:

在您的设置中,您应该始终有一个“init”容器,该容器执行基本操作,如扩展更新、主题编译等,入口点为/setup。当此容器退出时,您可以启动您实际的应用程序/工作容器。请参阅上面的docker-compose示例以获取详细信息。

环境变量

在一个非常基本的设置中,当所有文件都存储在本地时,您需要5个卷

建议在可能的情况下使用外部存储提供商来存储文件。使用外部存储提供商时,您不需要任何挂载。有关设置,请参阅官方Shopware文档

常见问题解答

使用Redis进行会话

您可以将PHP_SESSION_HANDLER设置为redis,并将PHP_SESSION_SAVE_PATH设置为任何redis路径,如tcp://redis:6379

已知问题

资产存储在本地,但asset-manifest.json尝试写入外部位置

覆盖asset-manifest.json的文件系统为临时文件系统

# config/packages/prod/asset-overwrite.yaml
services:
    Shopware\Core\Framework\Plugin\Util\AssetService:
        arguments:
            - '@shopware.filesystem.asset'
            - '@shopware.filesystem.temp'
            - '@kernel'
            - '@Shopware\Core\Framework\Plugin\KernelPluginLoader\KernelPluginLoader'
            - '@Shopware\Core\Framework\Adapter\Cache\CacheInvalidator'
            - '@Shopware\Core\Framework\App\Lifecycle\AppLoader'
            - '@parameter_bag'