shopware / docker
Shopware 6生产环境的Docker镜像
Requires
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'