From 7fb72fcb78e299fed381ea88834a65818c6a2179 Mon Sep 17 00:00:00 2001 From: Aode Date: Tue, 3 Mar 2020 10:51:01 -0600 Subject: [PATCH] Reset to upstream's docker --- Dockerfile | 126 ++++++++++++++++++++++++++++++++++++++ Makefile | 18 ------ container/Dockerfile | 68 -------------------- container/Dockerfile-deps | 70 --------------------- container/build-images.sh | 53 ---------------- 5 files changed, 126 insertions(+), 209 deletions(-) create mode 100644 Dockerfile delete mode 100644 Makefile delete mode 100644 container/Dockerfile delete mode 100644 container/Dockerfile-deps delete mode 100755 container/build-images.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..cc75bd6be --- /dev/null +++ b/Dockerfile @@ -0,0 +1,126 @@ +FROM ubuntu:18.04 as build-dep + +# Use bash for the shell +SHELL ["bash", "-c"] + +# Install Node v12 (LTS) +ENV NODE_VER="12.14.0" +RUN echo "Etc/UTC" > /etc/localtime && \ + apt update && \ + apt -y install wget python && \ + cd ~ && \ + wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-x64.tar.gz && \ + tar xf node-v$NODE_VER-linux-x64.tar.gz && \ + rm node-v$NODE_VER-linux-x64.tar.gz && \ + mv node-v$NODE_VER-linux-x64 /opt/node + +# Install jemalloc +ENV JE_VER="5.2.1" +RUN apt update && \ + apt -y install make autoconf gcc g++ && \ + cd ~ && \ + wget https://github.com/jemalloc/jemalloc/archive/$JE_VER.tar.gz && \ + tar xf $JE_VER.tar.gz && \ + cd jemalloc-$JE_VER && \ + ./autogen.sh && \ + ./configure --prefix=/opt/jemalloc && \ + make -j$(nproc) > /dev/null && \ + make install_bin install_include install_lib + +# Install ruby +ENV RUBY_VER="2.6.5" +ENV CPPFLAGS="-I/opt/jemalloc/include" +ENV LDFLAGS="-L/opt/jemalloc/lib/" +RUN apt update && \ + apt -y install build-essential \ + bison libyaml-dev libgdbm-dev libreadline-dev \ + libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \ + cd ~ && \ + wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \ + tar xf ruby-$RUBY_VER.tar.gz && \ + cd ruby-$RUBY_VER && \ + ./configure --prefix=/opt/ruby \ + --with-jemalloc \ + --with-shared \ + --disable-install-doc && \ + ln -s /opt/jemalloc/lib/* /usr/lib/ && \ + make -j$(nproc) > /dev/null && \ + make install + +ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin" + +RUN npm install -g yarn && \ + gem install bundler && \ + apt update && \ + apt -y install git libicu-dev libidn11-dev \ + libpq-dev libprotobuf-dev protobuf-compiler + +COPY Gemfile* package.json yarn.lock /opt/mastodon/ + +RUN cd /opt/mastodon && \ + bundle install -j$(nproc) --deployment --without development test && \ + yarn install --pure-lockfile + +FROM ubuntu:18.04 + +# Copy over all the langs needed for runtime +COPY --from=build-dep /opt/node /opt/node +COPY --from=build-dep /opt/ruby /opt/ruby +COPY --from=build-dep /opt/jemalloc /opt/jemalloc + +# Add more PATHs to the PATH +ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin" + +# Create the mastodon user +ARG UID=991 +ARG GID=991 +RUN apt update && \ + echo "Etc/UTC" > /etc/localtime && \ + ln -s /opt/jemalloc/lib/* /usr/lib/ && \ + apt install -y whois wget && \ + addgroup --gid $GID mastodon && \ + useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \ + echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd + +# Install mastodon runtime deps +RUN apt -y --no-install-recommends install \ + libssl1.1 libpq5 imagemagick ffmpeg \ + libicu60 libprotobuf10 libidn11 libyaml-0-2 \ + file ca-certificates tzdata libreadline7 && \ + apt -y install gcc && \ + ln -s /opt/mastodon /mastodon && \ + gem install bundler && \ + rm -rf /var/cache && \ + rm -rf /var/lib/apt/lists/* + +# Add tini +ENV TINI_VERSION="0.18.0" +ENV TINI_SUM="12d20136605531b09a2c2dac02ccee85e1b874eb322ef6baf7561cd93f93c855" +ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini /tini +RUN echo "$TINI_SUM tini" | sha256sum -c - +RUN chmod +x /tini + +# Copy over mastodon source, and dependencies from building, and set permissions +COPY --chown=mastodon:mastodon . /opt/mastodon +COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon + +# Run mastodon services in prod mode +ENV RAILS_ENV="production" +ENV NODE_ENV="production" + +# Tell rails to serve static files +ENV RAILS_SERVE_STATIC_FILES="true" +ENV BIND="0.0.0.0" + +# Set the run user +USER mastodon + +# Precompile assets +RUN cd ~ && \ + OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \ + yarn cache clean + +# Set the work dir and the container entry point +WORKDIR /opt/mastodon +ENTRYPOINT ["/tini", "--"] +EXPOSE 3000 4000 diff --git a/Makefile b/Makefile deleted file mode 100644 index d0f6dfa65..000000000 --- a/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -ifeq ($(TAG),) - TAG = $(shell git rev-parse --abbrev-ref HEAD)-$(shell git rev-parse HEAD) -endif - -DOCKERFILE = "container/Dockerfile" -DOCKERFILE_DEPS = "container/Dockerfile-deps" -IMAGE_NAME = "asonix/mastodon" -DEPS_IMAGE_NAME = "asonix/masto-deps" - -masto: images - -all: deps images - -deps: - ./container/build-images.sh $(DOCKERFILE_DEPS) $(TAG) $(DEPS_IMAGE_NAME) - -images: - ./container/build-images.sh $(DOCKERFILE) $(TAG) $(IMAGE_NAME) diff --git a/container/Dockerfile b/container/Dockerfile deleted file mode 100644 index 010227fe6..000000000 --- a/container/Dockerfile +++ /dev/null @@ -1,68 +0,0 @@ -FROM asonix/masto-deps:latest-amd64 as build-dep - -# Use bash for the shell -SHELL ["bash", "-c"] - -COPY Gemfile* package.json yarn.lock /opt/mastodon/ - -RUN cd /opt/mastodon && \ - bundle config set deployment 'true' && \ - bundle install --without development test --with production && \ - yarn install --pure-lockfile - -FROM amd64/ubuntu:19.10 - -# Copy over all the langs needed for runtime -COPY --from=build-dep /opt/node /opt/node -COPY --from=build-dep /opt/ruby /opt/ruby -COPY --from=build-dep /opt/jemalloc /opt/jemalloc -COPY --from=build-dep /tini /tini - -RUN chmod +rx /tini - -# Add more PATHs to the PATH -ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin" - -# Create the mastodon user -ARG UID=1001 -ARG GID=1001 -RUN apt-get update && \ - echo "Etc/UTC" > /etc/localtime && \ - ln -s /opt/jemalloc/lib/* /usr/lib/ && \ - apt-get install -y whois wget && \ - addgroup --gid $GID mastodon && \ - useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \ - echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd - -# Install mastodon runtime deps -RUN apt-get -y --no-install-recommends install \ - libssl1.1 libpq5 imagemagick ffmpeg \ - libicu63 libprotobuf17 libidn11 libyaml-0-2 \ - file ca-certificates tzdata libreadline8 && \ - apt-get -y install gcc && \ - ln -s /opt/mastodon /mastodon && \ - gem install bundler - -# Copy over mastodon source, and dependencies from building, and set permissions -COPY --chown=mastodon:mastodon . /opt/mastodon -COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon - -# Run mastodon services in prod mode -ENV RAILS_ENV="production" -ENV NODE_ENV="production" - -# Tell rails to serve static files -ENV RAILS_SERVE_STATIC_FILES="true" -ENV BIND="0.0.0.0" - -# Set the run user -USER mastodon - -# Precompile assets -RUN cd ~ && \ - OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \ - yarn cache clean - -# Set the work dir and the container entry point -WORKDIR /opt/mastodon -ENTRYPOINT ["/tini", "--"] diff --git a/container/Dockerfile-deps b/container/Dockerfile-deps deleted file mode 100644 index e37f6448d..000000000 --- a/container/Dockerfile-deps +++ /dev/null @@ -1,70 +0,0 @@ -FROM amd64/ubuntu:19.10 - -# Install Node -ENV NODE_VER="12.11.1" -ENV ARCH="x64" -RUN echo "Etc/UTC" > /etc/localtime && \ - apt update && \ - apt -y install wget python && \ - cd ~ && \ - wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-$ARCH.tar.gz && \ - tar xf node-v$NODE_VER-linux-$ARCH.tar.gz && \ - rm node-v$NODE_VER-linux-$ARCH.tar.gz && \ - mv node-v$NODE_VER-linux-$ARCH /opt/node - -# Install jemalloc -ENV JE_VER="5.2.1" -RUN apt update && \ - apt -y install make autoconf gcc g++ && \ - cd ~ && \ - wget https://github.com/jemalloc/jemalloc/archive/$JE_VER.tar.gz && \ - tar xf $JE_VER.tar.gz && \ - cd jemalloc-$JE_VER && \ - ./autogen.sh && \ - ./configure --prefix=/opt/jemalloc && \ - make -j$(nproc) > /dev/null && \ - make install_bin install_include install_lib - -# Install ruby -ENV RUBY_VER="2.6.5" -ENV CPPFLAGS="-I/opt/jemalloc/include" -ENV LDFLAGS="-L/opt/jemalloc/lib/" -RUN apt update && \ - apt -y install build-essential \ - bison libyaml-dev libgdbm-dev libreadline-dev \ - libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \ - cd ~ && \ - wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \ - tar xf ruby-$RUBY_VER.tar.gz && \ - cd ruby-$RUBY_VER && \ - ./configure --prefix=/opt/ruby \ - --with-jemalloc \ - --with-shared \ - --disable-install-doc && \ - ln -s /opt/jemalloc/lib/* /usr/lib/ && \ - make -j$(nproc) > /dev/null && \ - make install - -ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin" - -RUN npm install -g yarn && \ - gem install bundler && \ - apt update && \ - apt -y install git libicu-dev libidn11-dev \ - libpq-dev libprotobuf-dev protobuf-compiler - -# Add tini -ENV TINI_VERSION="0.18.0" -ENV TINI_ARCH="amd64" -ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-${TINI_ARCH} /tini -ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-${TINI_ARCH}.asc /tini.asc - -RUN apt update && \ - apt -y --no-install-recommends install gpg gpg-agent dirmngr - -RUN gpg --batch \ - --keyserver hkp://p80.pool.sks-keyservers.net:80 \ - --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 && \ - gpg --batch --verify /tini.asc /tini - -RUN chmod +rx /tini diff --git a/container/build-images.sh b/container/build-images.sh deleted file mode 100755 index 9a723bb08..000000000 --- a/container/build-images.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env bash - -set -xe - -SOURCE=$1 -TAG=$(echo $2 | sed 's/\//-/g') -NAME=$3 - -require_input() { - input=$1 - name=$2 - - if [ "$input" == "" ]; then - echo "Input, $name, required but not present" - exit 1; - fi -} - -require_input "$SOURCE" "Dockerfile" -require_input "$TAG" "image tag" -require_input "$NAME" "image name" - -ARCHITECTURES=('arm64v8') - -for architecture in "${ARCHITECTURES[@]}"; do - cp "$SOURCE" "$SOURCE-$architecture" - if [ "$architecture" == arm32v7 ]; then - sed -i'' 's/:amd64/:arm32v7/g' "$SOURCE-$architecture" # source image - sed -i'' 's/FROM amd64/FROM arm32v7/g' "$SOURCE-$architecture" # source image - sed -i'' 's/x64/armv7l/g' "$SOURCE-$architecture" # for node - sed -i'' 's/amd64/armhf/g' "$SOURCE-$architecture" # for tini - fi - - if [ "$architecture" == arm64v8 ]; then - sed -i'' 's/:latest-amd64/:latest-arm64v8/g' "$SOURCE-$architecture" # source image - sed -i'' 's/FROM amd64/FROM arm64v8/g' "$SOURCE-$architecture" # source image - sed -i'' 's/x64/arm64/g' "$SOURCE-$architecture" # for node - sed -i'' 's/amd64/arm64/g' "$SOURCE-$architecture" # for tini - fi - - docker build \ - --pull \ - --no-cache \ - -f "$SOURCE-$architecture" \ - -t "$NAME:$TAG-$architecture" \ - -t "$NAME:latest-$architecture" \ - . - - docker push "$NAME:$TAG-$architecture" - docker push "$NAME:latest-$architecture" - - rm "$SOURCE-$architecture" -done