bioconda-recipes: Missing ttf-dejavu/fontconfig dependencies for fastqc

If fontconfig or ttf-dejavu are not installed, fastqc can produce the following error:

java.lang.Error: Probable fatal error:No fonts found

which is identical to the error described here: https://stackoverflow.com/questions/14066525/java-lang-error-probable-fatal-errorno-fonts-found. This issue is at least encountered in the snakemake container used by snakemake-wrappers.

I think this error is not necessarily specific to fastqc, but likely a more general dependency of openjdk which is currently missing.

We can easily fix it for fontconfig by adding the dependency to the fastqc or openjdk recipes. However, for ttf-dejavu there does not seem to be an existing package as far as I can see. I have no experience with creating non-R/Python packages, so was wondering if someone would be prepared to build a ttf-dejavu package or otherwise provide me with pointers on how to do so.

About this issue

  • Original URL
  • State: closed
  • Created 7 years ago
  • Reactions: 1
  • Comments: 47 (42 by maintainers)

Commits related to this issue

Most upvoted comments

@bgruening - here’s a minimal example Dockerfile:

FROM continuumio/miniconda
MAINTAINER Phil Ewels <phil.ewels@scilifelab.se>

RUN conda config --add channels defaults \
 && conda config --add channels conda-forge \
 && conda config --add channels bioconda \
 && conda install -y fastqc=0.11.7

Building:

Click to expand log
docker build . -t fastqc_test
Sending build context to Docker daemon  133.2MB
Step 1/3 : FROM continuumio/miniconda
latest: Pulling from continuumio/miniconda
4176fe04cefe: Pull complete
3727fa417d9f: Pull complete
30fd03596c22: Pull complete
8d7f8695c318: Pull complete
Digest: sha256:c93288b9bb35847e575d5ee8f3469551d6c769812bed2ed59968af86897b0791
Status: Downloaded newer image for continuumio/miniconda:latest
 ---> 53447bc91028
Step 2/3 : MAINTAINER Phil Ewels <phil.ewels@scilifelab.se>
 ---> Running in 43967e10080f
Removing intermediate container 43967e10080f
 ---> 3fd3b0a9c1eb
Step 3/3 : RUN conda config --add channels defaults  && conda config --add channels conda-forge  && conda config --add channels bioconda  && conda install -y fastqc=0.11.7
 ---> Running in 6cbdbc89ded1
Warning: 'defaults' already in 'channels' list, moving to the top
Solving environment: ...working... done


==> WARNING: A newer version of conda exists. <==
  current version: 4.4.10
  latest version: 4.4.11

Please update conda by running

    $ conda update -n base conda


font-ttf-dejavu-sans-mono 2.37: ########## | 100%
perl 5.22.0.1: ########## | 100%
fastqc 0.11.7: ########## | 100%
openjdk 8.0.121: ########## | 100%

## Package Plan ##

  environment location: /opt/conda

  added / updated specs:
    - fastqc=0.11.7


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    font-ttf-dejavu-sans-mono-2.37|       h6964260_0         386 KB
    perl-5.22.0.1              |                0        15.1 MB  conda-forge
    fastqc-0.11.7              |       pl5.22.0_0         9.6 MB  bioconda
    openjdk-8.0.121            |                1        64.2 MB
    ------------------------------------------------------------
                                           Total:        89.3 MB

The following NEW packages will be INSTALLED:

    fastqc:                    0.11.7-pl5.22.0_0 bioconda
    font-ttf-dejavu-sans-mono: 2.37-h6964260_0
    openjdk:                   8.0.121-1
    perl:                      5.22.0.1-0        conda-forge


Downloading and Extracting Packages
Preparing transaction: ...working... done
Verifying transaction: ...working... done
Executing transaction: ...working... done
Removing intermediate container 6cbdbc89ded1
 ---> c3cf11270f71
Successfully built c3cf11270f71
Successfully tagged fastqc_test:latest

Then running a test:

$ docker container run -it fastqc_test bash
Click to expand log
# [ pasted mini fastq file ]

root@39ea321534b8:/# fastqc test.fq
Started analysis of test.fq
Analysis complete for test.fq
Exception in thread "Thread-1" java.lang.Error: Probable fatal error:No fonts found.
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1236)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
	at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
	at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1106)
	at sun.font.CompositeFont.doDeferredInitialisation(CompositeFont.java:263)
	at sun.font.CompositeFont.getSlotFont(CompositeFont.java:352)
	at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:78)
	at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93)
	at sun.font.FontDesignMetrics.initMatrixAndMetrics(FontDesignMetrics.java:359)
	at sun.font.FontDesignMetrics.<init>(FontDesignMetrics.java:350)
	at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:302)
	at sun.java2d.SunGraphics2D.getFontMetrics(SunGraphics2D.java:855)
	at uk.ac.babraham.FastQC.Graphs.QualityBoxPlot.paint(QualityBoxPlot.java:88)
	at javax.swing.JComponent.print(JComponent.java:1202)
	at uk.ac.babraham.FastQC.Modules.AbstractQCModule.writeDefaultImage(AbstractQCModule.java:68)
	at uk.ac.babraham.FastQC.Modules.PerBaseQualityScores.makeReport(PerBaseQualityScores.java:199)
	at uk.ac.babraham.FastQC.Report.HTMLReportArchive.<init>(HTMLReportArchive.java:131)
	at uk.ac.babraham.FastQC.Analysis.OfflineRunner.analysisComplete(OfflineRunner.java:178)
	at uk.ac.babraham.FastQC.Analysis.AnalysisRunner.run(AnalysisRunner.java:110)
	at java.lang.Thread.run(Thread.java:745)

root@39ea321534b8:/#

So the channel order should be correct I think, but I’m still getting the error.

Note - that if I explicitly add conda-forge::openjdk to the Dockerfile conda install command, everything is fine:

FROM continuumio/miniconda
MAINTAINER Phil Ewels <phil.ewels@scilifelab.se>

RUN conda config --add channels defaults \
 && conda config --add channels conda-forge \
 && conda config --add channels bioconda \
 && conda install -y conda-forge::openjdk fastqc=0.11.7
Click to expand log
$ docker build . -t fastqc_test_2

Sending build context to Docker daemon  133.2MB
Step 1/3 : FROM continuumio/miniconda
 ---> 53447bc91028
Step 2/3 : MAINTAINER Phil Ewels <phil.ewels@scilifelab.se>
 ---> Using cache
 ---> 3fd3b0a9c1eb
Step 3/3 : RUN conda config --add channels defaults  && conda config --add channels conda-forge  && conda config --add channels bioconda  && conda install -y conda-forge::openjdk fastqc=0.11.7
 ---> Running in bb556e1cccc6
Warning: 'defaults' already in 'channels' list, moving to the top
Solving environment: ...working... done


==> WARNING: A newer version of conda exists. <==
  current version: 4.4.10
  latest version: 4.4.11

Please update conda by running

    $ conda update -n base conda


openjdk 8.0.144: ########## | 100%
font-ttf-dejavu-sans-mono 2.37: ########## | 100%
perl 5.22.0.1: ########## | 100%
fastqc 0.11.7: ########## | 100%

## Package Plan ##

  environment location: /opt/conda

  added / updated specs:
    - conda-forge::openjdk
    - fastqc=0.11.7


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    openjdk-8.0.144            |   zulu8.23.0.3_1        69.3 MB  conda-forge
    font-ttf-dejavu-sans-mono-2.37|       h6964260_0         386 KB
    perl-5.22.0.1              |                0        15.1 MB  conda-forge
    fastqc-0.11.7              |       pl5.22.0_0         9.6 MB  bioconda
    ------------------------------------------------------------
                                           Total:        94.4 MB

The following NEW packages will be INSTALLED:

    fastqc:                    0.11.7-pl5.22.0_0      bioconda
    font-ttf-dejavu-sans-mono: 2.37-h6964260_0
    openjdk:                   8.0.144-zulu8.23.0.3_1 conda-forge
    perl:                      5.22.0.1-0             conda-forge


Downloading and Extracting Packages
Preparing transaction: ...working... done
Verifying transaction: ...working... done
Executing transaction: ...working... done
Removing intermediate container bb556e1cccc6
 ---> d8a0723e043e
Successfully built d8a0723e043e
Successfully tagged fastqc_test_2:latest
$ docker container run -it fastqc_test bash
# [ pasted mini fastq file ]

root@15a71d6a5e95:/# fastqc test.fq
Started analysis of test.fq
Analysis complete for test.fq
root@15a71d6a5e95:/#

So it seems that this can be fixed fairly easily by explicitly requiring the conda-forge version of openjdk. Could this be added to the bioconda FastQC recipe or something?

Resolved by gh-8588 and gh-8610.

Interestingly, the font package can then be removed and fastqc will continue to work.

To clarify this, FastQC doesn’t seem to need the fonts themselves to be present, just the entries in the fontconfig cache. When fc-cache is run after font removal, the FastQC errors return.

Ok, still having some issues here. I first thought that the channels order was causing this, but thats not the case:

Here’s my environment.yaml and I create the environment like this:

https://github.com/nf-core/eager/blob/dev/environment.yml

conda env create -f environment.yml

Unfortunately, when calling fastqc in there, I reproducibly get this error:

fastqc                                                                                                                                                          (nf-core-eager-2.1.0dev) 
java: symbol lookup error: /home/alex/.conda/envs/nf-core-eager-2.1.0dev/bin/../lib/libfontconfig.so.1: undefined symbol: FT_Done_MM_Var

cf https://github.com/nf-core/eager/issues/67

I’m afraid the fastqc 0.11.7–pl5.22.0_0 container suffer from the same problem.

Solved this problem on Ubuntu using: sudo apt install ttf-dejavu Hope this gets sorted at some point.

@rspreafico it looks like the fastqc container was last modified in May, while the missing fonts were added to the conda-forge openjdk in June. #6518 bumps the build number for fastqc. Once merged this should result in a new container containing an updated open-jdk that you can test.