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
63 changes: 56 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Build and Publish
on:
create:
tags:
- '*'
- '*'

jobs:
build-and-push-docker-image:
Expand All @@ -12,24 +12,73 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v2
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: Docker meta
id: meta
uses: docker/metadata-action@v4
uses: docker/metadata-action@v5
with:
images: polydice/base
tags: type=ref,event=tag

- name: Login to DockerHub
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build image and push to Docker Hub
uses: docker/build-push-action@v3
- name: Build and push
uses: docker/build-push-action@v6
with:
push: true
context: .
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}

- name: Build and push testing variant
uses: docker/build-push-action@v6
with:
push: true
context: .
tags: ${{ steps.meta.outputs.tags }}
file: ./Dockerfile.testing
platforms: linux/amd64,linux/arm64
tags: polydice/base:${{ github.ref_name }}-testing

sync-to-ecr:
name: Sync to ECR Public
needs: build-and-push-docker-image
runs-on: ubuntu-latest
if: success()

steps:
Comment on lines +53 to +59

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ECR sync job will fail if the DockerHub push fails, but there's no error handling or retry mechanism. Consider adding error handling or making the ECR sync conditional on successful DockerHub push.

Suggested change
sync-to-ecr:
name: Sync to ECR Public
needs: build-and-push-docker-image
runs-on: ubuntu-latest
steps:
sync-to-ecr:
name: Sync to ECR Public
needs: build-and-push-docker-image
runs-on: ubuntu-latest
if: success()
steps:

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1

- name: Login to Amazon ECR Public
uses: aws-actions/amazon-ecr-login@v2
with:
registry-type: public

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

- name: Sync multi-arch image to ECR
run: |
set -e
docker buildx imagetools create \
--tag public.ecr.aws/z1n0q3w1/base:${{ github.ref_name }} \
polydice/base:${{ github.ref_name }}
docker buildx imagetools create \
--tag public.ecr.aws/z1n0q3w1/base:${{ github.ref_name }}-testing \
polydice/base:${{ github.ref_name }}-testing
echo "Successfully synced to ECR Public"
60 changes: 37 additions & 23 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,17 +1,35 @@
ARG RUBY_VERSION=2.7.8
ARG VARIANT=jemalloc-slim
FROM quay.io/evl.ms/fullstaq-ruby:${RUBY_VERSION}-${VARIANT} as base
FROM ruby:${RUBY_VERSION}-slim

ARG BUNDLER_VERSION=2.4.20
SHELL ["/bin/bash", "-o", "pipefail", "-c"]

# jemalloc for better memory management
RUN apt-get update && apt-get install -y --no-install-recommends libjemalloc2 \
&& JEMALLOC_PATH=$(find /usr/lib -name "libjemalloc.so.2" | head -1) \
&& [ -n "$JEMALLOC_PATH" ] || (echo "libjemalloc.so.2 not found" && exit 1) \
&& ln -sf "$JEMALLOC_PATH" /usr/lib/libjemalloc.so.2 \

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛑 Logic Error: The symlink creation will fail if /usr/lib/libjemalloc.so.2 already exists. Use ln -sf to force overwrite or check if the symlink already exists before creating it.

Suggested change
&& ln -sf "$JEMALLOC_PATH" /usr/lib/libjemalloc.so.2 \
&& ln -sf "$JEMALLOC_PATH" /usr/lib/libjemalloc.so.2 \

&& rm -rf /var/lib/apt/lists/*
ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛑 Portability Issue: Hardcoded LD_PRELOAD path may not work across ARM64 and AMD64 architectures. The jemalloc library path can vary between architectures.

Suggested change
ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2
ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2


# Install build tools and native extension dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
libpq-dev \
libffi-dev \
&& rm -rf /var/lib/apt/lists/*

ARG BUNDLER_VERSION=2.4.22
RUN gem install -N bundler -v ${BUNDLER_VERSION}

ARG NODE_VERSION=18.18.0
ARG YARN_VERSION=1.22.22
ARG PNPM_VERSION=9.9.0
RUN curl https://get.volta.sh | bash
ENV VOLTA_HOME /root/.volta
RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates \
&& rm -rf /var/lib/apt/lists/* \
&& curl -fsSL https://get.volta.sh | bash
ENV VOLTA_HOME=/root/.volta
ENV VOLTA_FEATURE_PNPM=1
ENV PATH $VOLTA_HOME/bin:/usr/local/bin:$PATH
ENV PATH=$VOLTA_HOME/bin:/usr/local/bin:$PATH
RUN volta install node@${NODE_VERSION} && volta install yarn@${YARN_VERSION} && volta install pnpm@${PNPM_VERSION}

RUN apt-get update \
Expand All @@ -23,28 +41,24 @@ RUN apt-get update \
graphicsmagick \
file \
tar \
curl \
ca-certificates \
libmcrypt4 \
shared-mime-info \
libmcrypt4 \
&& rm -rf /var/lib/apt/lists/*

# Don't add g++/make to buildDeps, or purge will remove build-essential
WORKDIR /tmp
RUN set -ex \
\
&& buildDeps=' \
g++ \
make \
cmake \
python \
' \
&& buildDeps='cmake python3' \
&& apt-get update \
&& apt-get install -y --no-install-recommends $buildDeps \
&& rm -rf /var/lib/apt/lists/* \
\
&& curl -L https://github.com/BYVoid/OpenCC/archive/refs/tags/ver.1.1.9.tar.gz | tar -xz \
&& cd OpenCC-ver.1.1.9 \
&& REL_BUILD_DOCUMENTATION=OFF make install \
\
&& apt-get purge -y --auto-remove $buildDeps \
&& cd ../ \
&& curl -L https://github.com/BYVoid/OpenCC/archive/refs/tags/ver.1.1.9.tar.gz | tar -xz

WORKDIR /tmp/OpenCC-ver.1.1.9
RUN REL_BUILD_DOCUMENTATION=OFF make install

WORKDIR /tmp
RUN apt-get purge -y --auto-remove cmake python3 \
&& rm -rf OpenCC-ver.1.1.9

WORKDIR /app
13 changes: 13 additions & 0 deletions Dockerfile.testing
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM polydice/base:0.32.0-rc5

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
git \
openssh-client \
libpq-dev \
libxml2-dev \
libxslt1-dev \
libsasl2-dev \
libmcrypt-dev \
build-essential \
&& rm -rf /var/lib/apt/lists/*
47 changes: 40 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,46 @@ Polydice's base docker image for Rails applications.
## Variants

- `x.y.z` - Standard image for running on production
- `x.y.z-testing` - Image for testing which includes additional packages.
- `x.y.z-testing` - Image for testing which includes additional packages:
- git
- openssh-client
- libpq-dev
- libxml2-dev
- libxslt1-dev
- libsasl2-dev
- libmcrypt-dev
- build-essential

## Architectures

- `linux/amd64` (x86_64)
- `linux/arm64` (Graviton, Apple Silicon)

## Versions

| Version | Ruby | Node.js | Yarn | Bundler | pnpm |
|---------|-------|---------|---------|---------|-------|
| 0.31.2 | 2.7.8 | 18.18.0 | 1.22.22 | 2.4.20 | 9.9.0 |
| 0.31.1 | 2.7.8 | 18.18.0 | 1.22.19 | 2.4.20 | 8.8.0 |
| 0.31.0 | 2.7.7 | 18.18.0 | 1.22.19 | 2.4.5 | 8.8.0 |
| 0.30.3 | 2.7.7 | 14.21.2 | 1.22.19 | 2.4.5 | |
| Version | Ruby | Node.js | Yarn | Bundler | pnpm | ARM64 |
|---------|-------|---------|---------|---------|-------|-------|
| 0.32.0 | 2.7.8 | 18.18.0 | 1.22.22 | 2.4.22 | 9.9.0 | ✅ |
| 0.31.2 | 2.7.8 | 18.18.0 | 1.22.22 | 2.4.20 | 9.9.0 | ❌ |
| 0.31.1 | 2.7.8 | 18.18.0 | 1.22.19 | 2.4.20 | 8.8.0 | ❌ |
| 0.31.0 | 2.7.7 | 18.18.0 | 1.22.19 | 2.4.5 | 8.8.0 | ❌ |
| 0.30.3 | 2.7.7 | 14.21.2 | 1.22.19 | 2.4.5 | | ❌ |

## Release

1. Update version in README.md
2. Commit and push tag:
```bash
git tag <version>
git push origin <version>
```
3. GitHub Actions will automatically:
- Build multi-arch images (amd64 + arm64)
- Push to DockerHub
- Sync to ECR Public

## Changes in 0.32.0

- Switched from fullstaq-ruby to official Ruby image
- Added jemalloc via `LD_PRELOAD`
- Added ARM64 (linux/arm64) support