Skip to content

Instantly share code, notes, and snippets.

@secretpray
Created June 9, 2024 04:48
Show Gist options
  • Save secretpray/4d974f28bb82b4d99d881963d42e5855 to your computer and use it in GitHub Desktop.
Save secretpray/4d974f28bb82b4d99d881963d42e5855 to your computer and use it in GitHub Desktop.
Docker for JS

Building

  1. Робите окрему папку (поки для простоти так, потім коли розберетесь зрозумієте що можна по-іншому)

  2. Створюєте Dockerfile в тій папці

  3. В Dockerfile пишете щось виду

FROM ubuntu:22.04

# Необов'язково, але я додаю, бо я вже наївся sh і більше не хочу
SHELL ["/bin/bash", "-c"]

# Необов'язково, але я додаю
ENV TZ=Europe/Kiev
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# тільки якщо щось треба з apt
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
# За***ли ви, в базовій поставці ubuntu ніхера нема, я задовбався що в мене на компі все працює а в вашому докері захожу і ніхера нема до чого я звик, буде стояти тупо все що мені в теорії знадобиться коли прийдеться його дебажити в проді
apt-get install -y \
  htop screen tmux mc git nano curl wget g++ build-essential gcc make cmake autoconf automake psmisc net-tools mtr-tiny \
  libboost-all-dev libssl-dev libzmq3-dev libreadline-dev libsodium-dev pkg-config libunbound-dev libtool bsdmainutils libevent-dev libminiupnpc-dev autotools-dev python3 \
  libudev-dev zlib1g-dev libseccomp-dev libcap-dev libncap-dev obfs4proxy libgmp-dev libtinfo5 software-properties-common apt-transport-https

# ставимо node.js з nvm
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
# З nvm тепер перед кожним RUN прийдеться таке писати ~/.nvm/nvm.sh &&
# особливо якщо ви приберете SHELL ["/bin/bash", "-c"]
RUN ~/.nvm/nvm.sh && nvm i 18
RUN ~/.nvm/nvm.sh && nvm alias default 18

# тепер треба якось затягнути ваш проект
# варіант що скоріше вам підійде
# в корені папки з Dockerfile має бути папка repo з вашим проектом
# воно скопіює repo з локального компа всередину контейнера по другому аргументу. В данному випадку в workdir
COPY repo .
# УВАГА. Є набір команд які ламають можливість reuse проміжних snapshot'ів. COPY одна з таких команд
# Як працює build image. Кожна команда RUN після успішного виконання робить snapshot
# Відповідно build продовжується з останнього snapshot'у. Але COPY неможливо закешувати, оскільки результат залежить від контенту repo

# варіант 2 (для CI), прим треба сетапити доступ до вашого репозиторію
RUN git clone --recursive https://github.com/user/repo

# варіант 2.1 для локального
RUN echo "08.06.2024" && git clone --recursive https://github.com/user/repo
# Пояснюю навіщо echo. Якщо ви захочете заново клонувати репозиторій після оновлень, то docker вам благополучно закешує один раз і буде використовувати його
# echo з датою робить команду унікальною з одного боку, з іншого ви не втрачаєте кешування поки самі не скажете
# можна використовувати варіант 2, але тоді вам треба буде ручками видаляти необхідні кеші (по хешу, шукайте. І гарного вам настрою)

# ставимо залежності проекта
RUN ~/.nvm/nvm.sh && cd repo && npm ci

# якщо треба складати якісь дані, то туди
VOLUME /data

CMD ~/.nvm/nvm.sh && cd repo && npm start

Зараз сюди набіжуть адепти того, що я рекомендую всяку фігню, треба через 2 контейнера, що в мене використовується багато місця на диску і що я взагалі неправий Ну так хай дадуть лінки на правильний гайд тоді

  1. Будуємо image контейнеру docker build -t IMAGE_NAME .

  2. Будуємо instance контейнеру -v /local_path/to/data:/data \ лише якщо вам треба VOLUME

docker run -it -d \
  -v /local_path/to/data:/data \
  IMAGE_NAME

Результат виконання команди - DOCKER_ID який треба буде використовувати в інших командах

Troubleshooting

  1. Завалилась якась команда при build Закомментовуєте все в Dockerfile від заваленої команди і вниз (включаючи з заваленною командою) створюєте контейнер 'docker exec -t -i DOCKER_ID /bin/bash' І пробуєте ту саму команду (без RUN ) ручками Коли запрацює, підфіксіть команду в Dockerfile

  2. Завалилась сама аппка

Варіант 1 docker logs DOCKER_ID

Варіант 2 Комментуєте CMD build create instance docker exec -t -i DOCKER_ID /bin/bash І пробуєте запустити команду і подивитись інтерактивно Фіксите Dockerfile, пробуєте

Майте на увазі. Якщо команда CMD впаде, то впаде і контейнер. Це так задумано для моніторингу. Не тягніть в контейнер pm2, nodemon чи щось інше

  1. Зупинити контейнер docker stop DOCKER_ID

  2. Стартувати зупинений контейнер docker start DOCKER_ID

Quality of life

Лише під час розробки контейнеру, потім нафіг не потрібно

Не загальноприйнята практика, але. Створіть собі наступні файли

  • build.sh
  • create.sh
  • start.sh
  • stop.sh
  • restart.sh
  • ssh.sh (воно ніякий не ssh, але для мене це як "ssh на той сервер")
  • _drop.sh (там буде stop + docker rm DOCKER_ID). Підкреслення треба щоб ви цей файл випадково не виконали autocomplete'ом промахнувшись

В create

DOCKER_ID=`docker run -it -d $IMAGE_NAME`
echo -n $DOCKER_ID > DOCKER_ID

В інших файлах це можна використовувати типу так

#!/bin/bash
docker start `cat DOCKER_ID`

Якщо треба постійно перебудовувати, тестувати зробіть собі q.sh

#!/bin/bash
set -e
./_drop.sh
./build.sh
./create.sh
./ssh.sh

Контент файлів відповідно до того, що писалось раніше

Якщо нічого не допомогло

RTFM, там нескладно https://docs.docker.com/reference/dockerfile/#copy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment