Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions bin/sdk/images/common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ function Images::pull() {
docker pull "${SPRYKER_PLATFORM_IMAGE}" || true
}

function Images::pullUniversalBase() {
Console::verbose "${INFO}Pulling universal base image ${SPRYKER_UNIVERSAL_BASE_IMAGE}${NC}"
docker pull "${SPRYKER_UNIVERSAL_BASE_IMAGE}" 1>&2
}

function Images::destroy() {
Console::verbose "Removing all Spryker images"

Expand Down
5 changes: 5 additions & 0 deletions bin/sdk/images/mount.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ function Images::buildApplication() {
esac
done

if [ "${SPRYKER_USE_UNIVERSAL_BASE_IMAGE}" = "${TRUE}" ]; then
Images::pullUniversalBase
return
fi

Images::_buildApp mount
Images::tagApplications "${SPRYKER_DOCKER_TAG}"
}
Expand Down
10 changes: 10 additions & 0 deletions generator/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,16 @@ public function encode($value)

$projectData['_node_npm_config'] = buildNodeJsNpmBuildConfig($projectData);

// Universal dev base image support
$projectData['_useUniversalBaseImage'] = !empty($projectData['docker']['dev-base-image']['enabled']) && $mountMode !== 'baked';
if ($projectData['_useUniversalBaseImage']) {
$phpVersion = str_replace('spryker/php:', '', $projectData['image']['tag'] ?? 'spryker/php:8.4');
$nodeVersion = $projectData['image']['node']['version'] ?? DEFAULT_NODE_VERSION;
$projectData['_universalBaseImage'] = $projectData['docker']['dev-base-image']['image']
?? sprintf('spryker/dev-base:php%s-node%s', $phpVersion, $nodeVersion);
$projectData['_phpExtensionsString'] = implode(',', $projectData['_phpExtensions']);
}

foreach ($projectData['groups'] ?? [] as $groupName => $groupData) {
foreach ($groupData['applications'] ?? [] as $applicationName => $applicationData) {
foreach ($applicationData['endpoints'] ?? [] as $endpoint => $endpointData) {
Expand Down
10 changes: 10 additions & 0 deletions generator/src/templates/application/backend-gateway.yml.twig
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{{ applicationName | lower }}:
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
image: {{ project._universalBaseImage }}
{% else %}
image: ${SPRYKER_DOCKER_PREFIX}_run_app:${SPRYKER_DOCKER_TAG}-{{ applicationName | lower }}
{% endif %}
networks:
- private
labels:
Expand All @@ -16,4 +20,10 @@
TIDEWAYS_CLI_ENABLED: ${TIDEWAYS_CLI_ENABLED}
TIDEWAYS_ENVIRONMENT_NAME: ${TIDEWAYS_ENVIRONMENT_NAME}
BLACKFIRE_APM_ENABLED: ${BLACKFIRE_APM_ENABLED}
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
SPRYKER_PHP_EXTENSIONS: "{{ project._phpExtensionsString }}"
SPRYKER_USER_UID: "${USER_UID}"
APPLICATION_ENV: "${APPLICATION_ENV}"
SPRYKER_DB_ENGINE: "${SPRYKER_DB_ENGINE}"
{% endif %}
<<: *app-volumes
10 changes: 10 additions & 0 deletions generator/src/templates/application/backoffice.yml.twig
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{{ applicationName | lower }}:
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
image: {{ project._universalBaseImage }}
{% else %}
image: ${SPRYKER_DOCKER_PREFIX}_run_app:${SPRYKER_DOCKER_TAG}-{{ applicationName | lower }}
{% endif %}
networks:
- private
labels:
Expand All @@ -16,4 +20,10 @@
TIDEWAYS_CLI_ENABLED: ${TIDEWAYS_CLI_ENABLED}
TIDEWAYS_ENVIRONMENT_NAME: ${TIDEWAYS_ENVIRONMENT_NAME}
BLACKFIRE_APM_ENABLED: ${BLACKFIRE_APM_ENABLED}
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
SPRYKER_PHP_EXTENSIONS: "{{ project._phpExtensionsString }}"
SPRYKER_USER_UID: "${USER_UID}"
APPLICATION_ENV: "${APPLICATION_ENV}"
SPRYKER_DB_ENGINE: "${SPRYKER_DB_ENGINE}"
{% endif %}
<<: *app-volumes
10 changes: 10 additions & 0 deletions generator/src/templates/application/glue-backend.yml.twig
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{{ applicationName | lower }}:
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
image: {{ project._universalBaseImage }}
{% else %}
image: ${SPRYKER_DOCKER_PREFIX}_run_app:${SPRYKER_DOCKER_TAG}-{{ applicationName | lower }}
{% endif %}
networks:
- private
labels:
Expand All @@ -16,4 +20,10 @@
TIDEWAYS_CLI_ENABLED: ${TIDEWAYS_CLI_ENABLED}
TIDEWAYS_ENVIRONMENT_NAME: ${TIDEWAYS_ENVIRONMENT_NAME}
BLACKFIRE_APM_ENABLED: ${BLACKFIRE_APM_ENABLED}
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
SPRYKER_PHP_EXTENSIONS: "{{ project._phpExtensionsString }}"
SPRYKER_USER_UID: "${USER_UID}"
APPLICATION_ENV: "${APPLICATION_ENV}"
SPRYKER_DB_ENGINE: "${SPRYKER_DB_ENGINE}"
{% endif %}
<<: *app-volumes
10 changes: 10 additions & 0 deletions generator/src/templates/application/glue.yml.twig
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{{ applicationName | lower }}:
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
image: {{ project._universalBaseImage }}
{% else %}
image: ${SPRYKER_DOCKER_PREFIX}_run_app:${SPRYKER_DOCKER_TAG}-{{ applicationName | lower }}
{% endif %}
networks:
- private
labels:
Expand All @@ -16,4 +20,10 @@
TIDEWAYS_CLI_ENABLED: ${TIDEWAYS_CLI_ENABLED}
TIDEWAYS_ENVIRONMENT_NAME: ${TIDEWAYS_ENVIRONMENT_NAME}
BLACKFIRE_APM_ENABLED: ${BLACKFIRE_APM_ENABLED}
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
SPRYKER_PHP_EXTENSIONS: "{{ project._phpExtensionsString }}"
SPRYKER_USER_UID: "${USER_UID}"
APPLICATION_ENV: "${APPLICATION_ENV}"
SPRYKER_DB_ENGINE: "${SPRYKER_DB_ENGINE}"
{% endif %}
<<: *app-volumes
10 changes: 10 additions & 0 deletions generator/src/templates/application/merchant-portal.yml.twig
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{{ applicationName | lower }}:
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
image: {{ project._universalBaseImage }}
{% else %}
image: ${SPRYKER_DOCKER_PREFIX}_run_app:${SPRYKER_DOCKER_TAG}-{{ applicationName | lower }}
{% endif %}
networks:
- private
labels:
Expand All @@ -16,4 +20,10 @@
TIDEWAYS_CLI_ENABLED: ${TIDEWAYS_CLI_ENABLED}
TIDEWAYS_ENVIRONMENT_NAME: ${TIDEWAYS_ENVIRONMENT_NAME}
BLACKFIRE_APM_ENABLED: ${BLACKFIRE_APM_ENABLED}
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
SPRYKER_PHP_EXTENSIONS: "{{ project._phpExtensionsString }}"
SPRYKER_USER_UID: "${USER_UID}"
APPLICATION_ENV: "${APPLICATION_ENV}"
SPRYKER_DB_ENGINE: "${SPRYKER_DB_ENGINE}"
{% endif %}
<<: *app-volumes
10 changes: 10 additions & 0 deletions generator/src/templates/application/yves.yml.twig
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{{ applicationName | lower }}:
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
image: {{ project._universalBaseImage }}
{% else %}
image: ${SPRYKER_DOCKER_PREFIX}_run_app:${SPRYKER_DOCKER_TAG}-{{ applicationName | lower }}
{% endif %}
networks:
- private
labels:
Expand All @@ -16,4 +20,10 @@
TIDEWAYS_CLI_ENABLED: ${TIDEWAYS_CLI_ENABLED}
TIDEWAYS_ENVIRONMENT_NAME: ${TIDEWAYS_ENVIRONMENT_NAME}
BLACKFIRE_APM_ENABLED: ${BLACKFIRE_APM_ENABLED}
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
SPRYKER_PHP_EXTENSIONS: "{{ project._phpExtensionsString }}"
SPRYKER_USER_UID: "${USER_UID}"
APPLICATION_ENV: "${APPLICATION_ENV}"
SPRYKER_DB_ENGINE: "${SPRYKER_DB_ENGINE}"
{% endif %}
<<: *app-volumes
10 changes: 10 additions & 0 deletions generator/src/templates/application/zed.yml.twig
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{{ applicationName | lower }}:
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
image: {{ project._universalBaseImage }}
{% else %}
image: ${SPRYKER_DOCKER_PREFIX}_run_app:${SPRYKER_DOCKER_TAG}-{{ applicationName | lower }}
{% endif %}
networks:
- private
labels:
Expand All @@ -16,4 +20,10 @@
TIDEWAYS_CLI_ENABLED: ${TIDEWAYS_CLI_ENABLED}
TIDEWAYS_ENVIRONMENT_NAME: ${TIDEWAYS_ENVIRONMENT_NAME}
BLACKFIRE_APM_ENABLED: ${BLACKFIRE_APM_ENABLED}
{% if project._useUniversalBaseImage is defined and project._useUniversalBaseImage %}
SPRYKER_PHP_EXTENSIONS: "{{ project._phpExtensionsString }}"
SPRYKER_USER_UID: "${USER_UID}"
APPLICATION_ENV: "${APPLICATION_ENV}"
SPRYKER_DB_ENGINE: "${SPRYKER_DB_ENGINE}"
{% endif %}
<<: *app-volumes
9 changes: 9 additions & 0 deletions generator/src/templates/deploy.bash.twig
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,12 @@ readonly SPRYKER_BUILD_DATE="${SPRYKER_BUILD_DATE}"
readonly SPRYKER_REPOSITORY_HASH="${SPRYKER_BUILD_HASH:-"$(git rev-parse --verify HEAD 2>/dev/null || echo "head")"}"
readonly SPRYKER_MAINTENANCE_MODE_ENABLED="{{ docker['maintenance']['enabled'] | default('false') }}"

# Universal dev base image
{% if _useUniversalBaseImage is defined and _useUniversalBaseImage %}
readonly SPRYKER_USE_UNIVERSAL_BASE_IMAGE="${TRUE}"
readonly SPRYKER_UNIVERSAL_BASE_IMAGE="{{ _universalBaseImage }}"
{% endif %}

# PHP extensions
{% for phpExtensionName in _phpExtensions %}
readonly {{ phpExtensionName | upper }}_EXTENSION_ENABLED="${TRUE}"
Expand Down Expand Up @@ -248,6 +254,9 @@ export BLACKFIRE_APM_ENABLED=${BLACKFIRE_APM_ENABLED:-{{ image['environment']['B
export TIDEWAYS_APIKEY=${TIDEWAYS_APIKEY}
export TIDEWAYS_CLI_ENABLED=${TIDEWAYS_CLI_ENABLED}
export TIDEWAYS_ENVIRONMENT_NAME=${TIDEWAYS_ENVIRONMENT_NAME}
{% if _useUniversalBaseImage is defined and _useUniversalBaseImage %}
export USER_UID=${USER_FULL_ID%%:*}
{% endif %}

{# For avoid https://github.com/docker/compose/issues/9104 #}
export DOCKER_COMPOSE_TTY_DISABLED="$(Environment::getDockerComposeTTY)"
Expand Down
21 changes: 21 additions & 0 deletions generator/src/templates/docker-compose.yml.twig
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ x-volumes:
&app-volumes
volumes:
{% include "application-volumes.yml.twig" with _context %}
{% if _useUniversalBaseImage is defined and _useUniversalBaseImage %}
- ./${DEPLOYMENT_PATH}/context/php/conf.d/99-from-deploy-yaml-php.ini:/usr/local/etc/php/conf.d/99-from-deploy-yaml-php.ini:ro
- ./${DEPLOYMENT_PATH}/context/nginx/ssl/ca.crt:/usr/local/share/ca-certificates/spryker-ca.crt:ro
{% endif %}

services:

Expand All @@ -24,7 +28,11 @@ services:
{% endif %}

cli:
{% if _useUniversalBaseImage is defined and _useUniversalBaseImage %}
image: {{ _universalBaseImage }}
{% else %}
image: ${SPRYKER_DOCKER_PREFIX}_run_cli:${SPRYKER_DOCKER_TAG}
{% endif %}
networks:
- public
- private
Expand All @@ -36,6 +44,12 @@ services:
- ssh-relay:/home/spryker/ssh-relay
- cli_history:/home/spryker/history:rw
- ./${DEPLOYMENT_PATH}/env/cli:/home/spryker/env:ro
{% if _useUniversalBaseImage is defined and _useUniversalBaseImage %}
- ./${DEPLOYMENT_PATH}/context/cli:/home/spryker/bin:ro
- ./${DEPLOYMENT_PATH}/context/php/conf.d/99-from-deploy-yaml-php.ini:/usr/local/etc/php/conf.d/99-from-deploy-yaml-php.ini:ro
- ./${DEPLOYMENT_PATH}/context/nginx/ssl/ca.crt:/usr/local/share/ca-certificates/spryker-ca.crt:ro
- ./${DEPLOYMENT_PATH}/context/jenkins/jenkins.docker.xml.twig:/home/spryker/jenkins.docker.xml.twig:ro
{% endif %}
{% include "application-volumes.yml.twig" with _context %}
tty: true
environment:
Expand All @@ -50,6 +64,13 @@ services:
TIDEWAYS_APIKEY: ${TIDEWAYS_APIKEY}
TIDEWAYS_CLI_ENABLED: ${TIDEWAYS_CLI_ENABLED}
TIDEWAYS_ENVIRONMENT_NAME: ${TIDEWAYS_ENVIRONMENT_NAME}
{% if _useUniversalBaseImage is defined and _useUniversalBaseImage %}
SPRYKER_PHP_EXTENSIONS: "{{ _phpExtensionsString }}"
SPRYKER_USER_UID: "${USER_UID}"
APPLICATION_ENV: "${APPLICATION_ENV}"
SPRYKER_DB_ENGINE: "${SPRYKER_DB_ENGINE}"
SPRYKER_PIPELINE: "${SPRYKER_PIPELINE}"
{% endif %}
command:
- "node"
- "/home/spryker/bin/cli-rpc.js"
Expand Down
92 changes: 92 additions & 0 deletions images/universal/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# syntax = docker/dockerfile:experimental
ARG SPRYKER_PHP_VERSION=8.4
ARG SPRYKER_NODE_VERSION=24
ARG SPRYKER_NPM_VERSION=10

FROM node:${SPRYKER_NODE_VERSION}-bookworm-slim AS node
ARG SPRYKER_NPM_VERSION
RUN npm install -g npm@${SPRYKER_NPM_VERSION}

FROM spryker/php:${SPRYKER_PHP_VERSION} AS dev-base

ENV SPRYKER_IN_DOCKER=1
ENV COMPOSER_IGNORE_CHROMEDRIVER=1
WORKDIR /data

# Log directory
ENV SPRYKER_LOG_DIRECTORY=/tmp/spryker/logs
RUN mkdir -p /tmp/spryker/logs && chown spryker:spryker /tmp/spryker/logs

# SSH
RUN mkdir -p /home/spryker/.ssh && chmod 0700 /home/spryker/.ssh && chown spryker:spryker -R /home/spryker/.ssh

# PHP-FPM defaults
ENV PHP_FPM_PM=dynamic
ENV PHP_FPM_PM_MAX_CHILDREN=4
ENV PHP_FPM_PM_START_SERVERS=2
ENV PHP_FPM_PM_MIN_SPARE_SERVERS=1
ENV PHP_FPM_PM_MAX_SPARE_SERVERS=2
ENV PHP_FPM_PM_MAX_REQUESTS=500
ENV PHP_FPM_REQUEST_TERMINATE_TIMEOUT=1m

# PHP base config (generic defaults)
COPY context/php/php-fpm.d/worker.conf /usr/local/etc/php-fpm.d/worker.conf
COPY context/php/php.ini /usr/local/etc/php/
COPY context/php/conf.d/90-opcache.ini /usr/local/etc/php/conf.d/
COPY context/php/conf.d/91-opcache-dev.ini /usr/local/etc/php/conf.d/
RUN rm -f /usr/local/etc/php/conf.d/opcache.ini

# NodeJS + NPM
COPY --from=node /usr/lib /usr/lib
COPY --from=node /usr/local/share /usr/local/share
COPY --from=node /usr/local/lib /usr/local/lib
COPY --from=node /usr/local/include /usr/local/include
COPY --from=node /usr/local/bin /usr/local/bin

# Blackfire client (always installed, activation is separate)
RUN mkdir -p /tmp/blackfire \
&& architecture=$(case $(uname -m) in i386|i686|x86) echo "i386";; x86_64|amd64) echo "amd64";; aarch64|arm64|armv8) echo "arm64";; *) echo "amd64";; esac) \
&& wget -qO- -U "Docker" https://blackfire.io/api/v1/releases/cli/linux/$architecture | tar zxp -C /tmp/blackfire \
&& mv /tmp/blackfire/blackfire /usr/bin/blackfire \
&& rm -Rf /tmp/blackfire

ENV PATH=/data/vendor/bin:/home/spryker/bin:$PATH

# Linux packages (all dev tools including supervisor for debug mode)
RUN apt update -y && apt install -y \
inotify-tools \
netcat-openbsd \
git \
redis-tools \
jq \
python3 \
g++ \
make \
supervisor \
gosu \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt update -y && apt install -y yarn \
&& rm -rf /var/lib/apt/lists/*

# Debug support directories (pre-created)
RUN /usr/bin/install -d -m 777 /var/run/opcache/debug && mkdir -p /var/log/supervisor

# Spryker user setup
USER spryker
RUN mkdir -p /home/spryker/env \
&& mkdir -p /home/spryker/ssh-relay && chmod 777 /home/spryker/ssh-relay \
&& touch /home/spryker/ssh-relay/ssh-auth.sock && chmod 666 /home/spryker/ssh-relay/ssh-auth.sock \
&& touch /tmp/stdout && touch /tmp/stderr && chmod 666 /tmp/stdout && chmod 666 /tmp/stderr \
&& mkdir -p /home/spryker/history && touch /home/spryker/history/.bash_history && chmod 0600 /home/spryker/history/.bash_history

ENV HISTFILE=/home/spryker/history/.bash_history
ENV NEWRELIC_ENABLED=0
ENV DEVELOPMENT_CONSOLE_COMMANDS=1

USER root
COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["php-fpm", "--nodaemonize"]
EXPOSE 9000
9 changes: 9 additions & 0 deletions images/universal/context/php/conf.d/90-opcache.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
;zend_extension=opcache.so
opcache.enable = 1
opcache.enable_cli = 1
opcache.file_cache = /var/run/opcache
opcache.max_accelerated_files = 50000
opcache.memory_consumption = 384
opcache.interned_strings_buffer = 64
opcache.fast_shutdown = 1
opcache.validate_timestamps = 0
4 changes: 4 additions & 0 deletions images/universal/context/php/conf.d/91-opcache-dev.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
;Development opcache configuration
;Must be included after opcache.ini
opcache.validate_timestamps = 1
opcache.revalidate_freq = 1
26 changes: 26 additions & 0 deletions images/universal/context/php/php-fpm.d/worker.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
[global]
; limit of aws PutLogEvents https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html
log_limit = 1048576

[worker]
clear_env = no
catch_workers_output = yes
decorate_workers_output = no
listen = 9000
listen.backlog = 128
user = spryker
group = www-data
pm = ${PHP_FPM_PM}
pm.max_children = ${PHP_FPM_PM_MAX_CHILDREN}
pm.start_servers = ${PHP_FPM_PM_START_SERVERS}
pm.min_spare_servers = ${PHP_FPM_PM_MIN_SPARE_SERVERS}
pm.max_spare_servers = ${PHP_FPM_PM_MAX_SPARE_SERVERS}
pm.max_requests = ${PHP_FPM_PM_MAX_REQUESTS}

pm.status_path = /php-fpm-status-worker
ping.path = /fpm-ping.php
ping.response = OK

request_terminate_timeout = ${PHP_FPM_REQUEST_TERMINATE_TIMEOUT}

chdir = /
Loading
Loading