shopware/docker-base本仓库包含一个基础镜像,基于Alpine + PHP + (Caddy或Nginx),可用于构建包含项目代码的Docker镜像。
警告:由于
Transfer-Encoding可能存在DoS风险,建议使用Nginx镜像而非Caddy。查看此问题了解更多信息
注意:此Docker镜像要求通过Composer安装所有扩展。否则,将出现
类X未找到错误。详见文档
在项目中创建如下Dockerfile:
dockerfile#syntax=docker/dockerfile:1.4 # 固定版本 FROM ghcr.io/shopware/docker-base:8.2-nginx as base-image FROM ghcr.io/friendsofshopware/shopware-cli:latest-php-8.2 as shopware-cli # 构建阶段 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 # 构建最终镜像 FROM base-image COPY --from=build --chown=www-data /src /var/www/html
或更好的方式:运行composer req shopware/docker安装Symfony Recipe。
在build阶段,我们使用shopware-cli构建Shopware文件:
更多关于shopware-cli project ci的信息,请参考shopware-cli。
在CI流水线中构建包含源代码的自定义Docker镜像,并推送到容器仓库。之后可在docker-compose、Kubernetes等环境中使用该镜像。
yamlname: 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 }}
注意 以下配置不共享var/log或var/cache。建议使用Redis进行缓存,日志应转发到stderr以便在容器日志中查看。
yamlversion: "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示例。
| 变量 | 默认值 | 描述 |
|---|---|---|
| APP_ENV | prod | 环境 |
| APP_SECRET | (空) | 可通过openssl rand -hex 32生成 |
| INSTANCE_ID | (空) | 商店唯一标识符:可通过openssl rand -hex 32生成 |
| JWT_PRIVATE_KEY | (空) | 可通过shopware-cli project generate-jwt --env生成 |
| JWT_PUBLIC_KEY | (空) | 可通过shopware-cli project generate-jwt --env生成 |
| LOCK_DSN | flock | Symfony锁定DSN |
| APP_URL | (空) | Shopware访问地址 |
| DATABASE_HOST | (空) | MySQL主机(用于检查MySQL是否存活) |
| DATABASE_PORT | 3306 | MySQL端口(用于检查MySQL是否存活) |
| BLUE_GREEN_DEPLOYMENT | 0 | 启用需超级权限以创建触发器 |
| DATABASE_URL | (空) | MySQL凭证DSN |
| DATABASE_SSL_CA | (空) | SSL CA文件路径(需对uid 512可读) |
| DATABASE_SSL_CERT | (空) | SSL证书文件路径(需对uid 512可读) |
| DATABASE_SSL_KEY | (空) | SSL密钥文件路径(需对uid 512可读) |
| DATABASE_SSL_DONT_VERIFY_SERVER_CERT | (空) | 禁用服务器证书验证(1表示禁用) |
| MAILER_DSN | null://localhost | 邮件发送DSN(管理后台配置可覆盖此值) |
| OPENSEARCH_URL | (空) | OpenSearch主机 |
| SHOPWARE_ES_ENABLED | 0 | 是否启用OpenSearch支持 |
| SHOPWARE_ES_INDEXING_ENABLED | 0 | 是否启用OpenSearch索引 |
| SHOPWARE_ES_INDEX_PREFIX | (空) | OpenSearch索引前缀 |
| COMPOSER_HOME | /tmp/composer | 插件管理器缓存目录 |
| SHOPWARE_HTTP_CACHE_ENABLED | 1 | 是否启用HTTP缓存 |
| SHOPWARE_HTTP_DEFAULT_TTL | 7200 | HTTP缓存默认TTL |
| MESSENGER_TRANSPORT_DSN | (空) | 默认异步队列DSN(示例:amqp://guest:guest@localhost:5672/%2f/default) |
| MESSENGER_TRANSPORT_LOW_PRIORITY_DSN | (空) | 低优先级队列DSN(示例:amqp://guest:guest@localhost:5672/%2f/low_prio) |
| MESSENGER_TRANSPORT_FAILURE_DSN | (空) | 失败消息队列DSN(示例:amqp://guest:guest@localhost:5672/%2f/failure) |
| COMPOSER_PLUGIN_LOADER | 1 | 启用时禁用动态插件加载,所有插件需通过Composer安装(详见文档) |
| INSTALL_LOCALE | en-GB | 商店默认语言 |
| INSTALL_CURRENCY | EUR | 商店默认货币 |
| INSTALL_ADMIN_USERNAME | admin | 默认管理员用户名 |
| INSTALL_ADMIN_PASSWORD | shopware | 默认管理员密码 |
| PHP_SESSION_COOKIE_LIFETIME | 0 | 参考PHP FPM文档([***] |
| PHP_SESSION_GC_MAXLIFETIME | 1440 | 参考PHP FPM文档([***] |
| PHP_SESSION_HANDLER | files | 设置为redis使用Redis存储会话 |
| PHP_SESSION_SAVE_PATH | (空) | Redis会话存储路径,如tcp://redis:6379 |
| PHP_MAX_UPLOAD_SIZE | 128m | 参考PHP文档 |
| PHP_MAX_EXECUTION_TIME | 300 | 参考PHP文档 |
| PHP_MEMORY_LIMIT | 512m | 参考PHP文档 |
| FPM_PM | dynamic | 参考PHP FPM文档([***] |
| FPM_PM_MAX_CHILDREN | 5 | 参考PHP FPM文档([***] |
| FPM_PM_START_SERVERS | 2 | 参考PHP FPM文档([***] |
| FPM_PM_MIN_SPARE_SERVERS | 1 | 参考PHP FPM文档([***] |
| FPM_PM_MAX_SPARE_SERVERS | 3 | 参考PHP FPM文档([***] |
在基础设置中,当所有文件本地存储时,需5个卷:
| 用途 | 路径 |
|---|---|
| 发票/私有文件 | /var/www/html/files |
| 主题文件 | /var/www/html/public/theme |
| 图片 | /var/www/html/public/media |
| 图片缩略图 | /var/www/html/public/thumbnail |
| 生成的站点地图 | /var/www/html/public/sitemap |
建议尽可能使用外部存储服务存储文件。使用外部存储服务时无需挂载卷。详见Shopware官方文档。
可将PHP_SESSION_HANDLER设置为redis,PHP_SESSION_SAVE_PATH设置为Redis路径,如tcp://redis:6379
将asset-manifest.json的文件系统覆盖为临时文件系统:
yaml# 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'
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务