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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 37 additions & 6 deletions .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,58 @@ on:
branches: [ "main", "master" ]

jobs:
build:
build-and-push:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- image_repo: sigrepo-mysql
context: mysql
dockerfile: mysql/Dockerfile
build_args: |
mysql_image=mysql:8.0-bookworm
tags_extra: ""
- image_repo: sigrepo-api
context: .
dockerfile: Dockerfile
build_args: |
R_VERSION=4.4.3
SIGREPO_BRANCH=master
tags_extra: |
${{ secrets.DOCKERHUB_USERNAME }}/sigrepo-shiny:latest
${{ secrets.DOCKERHUB_USERNAME }}/sigrepo-shiny:${{ github.sha }}
${{ secrets.DOCKERHUB_USERNAME }}/sigrepo:latest
${{ secrets.DOCKERHUB_USERNAME }}/sigrepo:${{ github.sha }}

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to Docker Hub
if: github.event_name == 'push'
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build and push Docker image
- name: Build and push ${{ matrix.image_repo }}
uses: docker/build-push-action@v5
with:
context: .
push: true
context: ${{ matrix.context }}
file: ${{ matrix.dockerfile }}
build-args: ${{ matrix.build_args }}
platforms: linux/amd64,linux/arm64
push: ${{ github.event_name == 'push' }}
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/sigrepo:latest
${{ secrets.DOCKERHUB_USERNAME }}/sigrepo:${{ github.sha }}
${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.image_repo }}:latest
${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.image_repo }}:${{ github.sha }}
${{ matrix.tags_extra }}
cache-from: type=gha
cache-to: type=gha,mode=max
20 changes: 12 additions & 8 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Build according to a specified version of R
ARG R_VERSION
ARG R_VERSION=${R_VERSION:-4.5.0}
ARG R_VERSION=${R_VERSION:-4.4.3}

############# Build Stage ##################

# Get shiny+tidyverse+devtools packages from rocker image
FROM rocker/shiny-verse:${R_VERSION} AS base
# Use a multi-arch Rocker base.
FROM rocker/r-ver:${R_VERSION} AS base

# Build according to a specified version of R
ARG SIGREPO_BRANCH
Expand All @@ -22,6 +22,12 @@ ARG DEBIAN_FRONTEND=noninteractive
# Install system libraries of general use
RUN apt-get update --allow-releaseinfo-change --fix-missing \
&& apt-get -y --no-install-recommends install \
build-essential \
pkg-config \
libcurl4-openssl-dev \
libssl-dev \
libxml2-dev \
default-libmysqlclient-dev \
librsvg2-dev \
libudunits2-dev \
libv8-dev \
Expand Down Expand Up @@ -90,16 +96,16 @@ RUN Rscript "${SIGREPO_SERVER_DIR}/install_r_packages.R"
RUN R -e "BiocManager::install('limma')"

# Install OmicSignature
RUN R -e "devtools::install_github(repo = 'montilab/OmicSignature', dependencies = TRUE)"
RUN R -e "remotes::install_github(repo = 'montilab/OmicSignature', dependencies = c('Depends','Imports','LinkingTo'))"

# Install dependencies for OmicSignature
RUN R -e "BiocManager::install('biomaRt')"

# Install SigRepo
RUN R -e "branch <- base::Sys.getenv('SIGREPO_BRANCH'); devtools::install_github(repo = 'montilab/SigRepo', ref = branch, dependencies = TRUE)"
RUN R -e "branch <- base::Sys.getenv('SIGREPO_BRANCH'); remotes::install_github(repo = 'montilab/SigRepo', ref = branch, dependencies = c('Depends','Imports','LinkingTo'))"

# Install hypeR
RUN R -e "devtools::install_github(repo = 'montilab/hypeR', dependencies = TRUE)"
RUN R -e "remotes::install_github(repo = 'montilab/hypeR', dependencies = c('Depends','Imports','LinkingTo'))"

# Expose app at port 3838
EXPOSE 3838
Expand All @@ -121,5 +127,3 @@ RUN dos2unix ${SIGREPO_SERVER_DIR}/api/api-server.sh

# Allow permissions to execute the bash script
RUN chmod a+x ${SIGREPO_SERVER_DIR}/api/api-server.sh


12 changes: 6 additions & 6 deletions docker-compose-build-version.yml
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
x-sql-volume:
&sql-volume
type: bind
source: /Users/reinachau/mysql/database
source: /Users/cameronvicnaire/mysql/database
target: /var/lib/mysql

x-difexp-volume:
&difexp-volume
type: bind
source: /Users/reinachau/mysql/difexp
source: /Users/cameronvicnaire/mysql/difexp
target: /difexp

x-omic-signature-volume:
&omic-signature-volume
type: bind
source: /Users/reinachau/OmicSignature
source: /Users/cameronvicnaire/Documents/GitHub/OmicSignature
target: /OmicSignature

x-hyper-volume:
&hyper-volume
type: bind
source: /Users/reinachau/hypeR
source: /Users/cameronvicnaire/Documents/GitHub/hypeR
target: /hypeR

x-sigrepo-volume:
&sigrepo-volume
type: bind
source: /Users/reinachau/SigRepo
source: /Users/cameronvicnaire/Documents/GitHub/SigRepo
target: /SigRepo

x-sigrepo-server-volume:
&sigrepo-server-volume
type: bind
source: /Users/reinachau/SigRepo_Server
source: /Users/cameronvicnaire/Documents/GitHub/SigRepo_Server
target: /SigRepo_Server

services:
Expand Down
104 changes: 55 additions & 49 deletions install_r_packages.R
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,49 +1,55 @@

# Create a list of start-up packages
startup_packages <- c("BiocManager", "dplyr", "rvest", "xml2", "yaml")

# Select only the packages that aren't currently installed in the system
install_startup_packages <- startup_packages[base::which(!startup_packages %in% utils::installed.packages())]

# And finally we install the required packages
for(pkg in install_startup_packages) utils::install.packages(pkg, dependencies=TRUE, repos='http://cran.rstudio.com/')

# Load packages
library(BiocManager)
library(dplyr)
library(rvest)
library(xml2)
library(yaml)

# Get all available Bioconductor packages
url <- 'https://www.bioconductor.org/packages/release/bioc/'
biocPackages <- url |>
xml2::read_html() |>
rvest::html_table() |>
base::lapply(`[[`, "Package") |>
base::unlist()

# Read in package dependencies in DESCRIPTION
DESCRIPTION <- yaml::read_yaml("DESCRIPTION")

# Extract all imports packages
required_pkgs <- base::trimws(base::strsplit(DESCRIPTION$Imports, ",", fixed=TRUE)[[1]])

# Extract all required bioconductor packages
bioconductor_pkgs <- required_pkgs[base::which(required_pkgs %in% biocPackages)]

# Select only the packages that aren't currently installed in the system
install_bioconductor_pkgs <- bioconductor_pkgs[base::which(!bioconductor_pkgs %in% utils::installed.packages())]

# And finally we install the required Bioconductor packages
for(pkg in install_bioconductor_pkgs) BiocManager::install(pkg)

# Extract all required CRAN packages
cran_pkgs <- required_pkgs[base::which(!required_pkgs %in% bioconductor_pkgs)]

# Select only the packages that aren't currently installed in the system
install_cran_pkgs <- cran_pkgs[base::which(!cran_pkgs %in% utils::installed.packages())]

# And finally we install the required packages including their dependencies
for(pkg in install_cran_pkgs) utils::install.packages(pkg, dependencies = TRUE, repos='http://cran.rstudio.com/')

repos <- "https://cloud.r-project.org"
options(repos = c(CRAN = repos))

install_if_missing <- function(pkgs) {
installed <- rownames(utils::installed.packages())
to_install <- setdiff(pkgs, installed)
if (length(to_install) > 0) {
utils::install.packages(
to_install,
dependencies = c("Depends", "Imports", "LinkingTo"),
repos = repos
)
}
}

# Minimal bootstrap only.
bootstrap_pkgs <- c("BiocManager", "remotes", "yaml")
install_if_missing(bootstrap_pkgs)

# Parse DESCRIPTION (DCF format)
desc <- read.dcf("DESCRIPTION")
imports_field <- if ("Imports" %in% colnames(desc)) desc[1, "Imports"] else ""

parse_pkg_names <- function(field) {
if (!nzchar(field)) return(character(0))
x <- unlist(strsplit(field, ",", fixed = TRUE), use.names = FALSE)
x <- trimws(gsub("\\s*\\(.*\\)", "", x))
x[x != ""]
}

required_pkgs <- unique(parse_pkg_names(imports_field))

bioc_available <- tryCatch(BiocManager::available(), error = function(e) character(0))
bioc_pkgs <- intersect(required_pkgs, bioc_available)
cran_pkgs <- setdiff(required_pkgs, bioc_pkgs)

if (length(cran_pkgs) > 0) {
install_if_missing(cran_pkgs)
}

if (length(bioc_pkgs) > 0) {
installed <- rownames(utils::installed.packages())
bioc_to_install <- setdiff(bioc_pkgs, installed)
if (length(bioc_to_install) > 0) {
BiocManager::install(bioc_to_install, ask = FALSE, update = FALSE)
}
}

installed <- rownames(utils::installed.packages())
missing <- setdiff(required_pkgs, installed)
if (length(missing) > 0) {
stop(sprintf("Failed to install required packages: %s", paste(missing, collapse = ", ")))
}

cat("Dependency install complete.\n")
27 changes: 18 additions & 9 deletions mysql/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,23 @@ ARG mysql_image=${mysql_image:-mysql:8.0-bookworm}
############# Build Stage ##################
FROM ${mysql_image} AS base

# Install system libraries of general use
RUN apt-get update --allow-releaseinfo-change --fix-missing \
&& apt-get -y --no-install-recommends install \
vim \
curl \
&& apt clean autoclean \
&& apt autoremove --yes \
&& rm -rf /var/lib/{apt,dpkg,cache,log}/
# Install small debug tools across distro variants used by mysql base images.
RUN set -eux; \
if command -v apt-get >/dev/null 2>&1; then \
apt-get update --allow-releaseinfo-change --fix-missing; \
apt-get -y --no-install-recommends install vim curl; \
apt-get clean; \
rm -rf /var/lib/apt/lists/*; \
elif command -v microdnf >/dev/null 2>&1; then \
microdnf install -y vim-minimal curl; \
microdnf clean all; \
elif command -v yum >/dev/null 2>&1; then \
yum install -y vim-minimal curl; \
yum clean all; \
else \
echo "No supported package manager found in base image"; \
exit 1; \
fi

# Expose mysql to host
EXPOSE 3306 33060
EXPOSE 3306 33060
Loading
Loading