本仓库包含一个基础镜像,基于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'
来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429