-
Робите окрему папку (поки для простоти так, потім коли розберетесь зрозумієте що можна по-іншому)
-
Створюєте Dockerfile в тій папці
-
В 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 контейнера, що в мене використовується багато місця на диску і що я взагалі неправий Ну так хай дадуть лінки на правильний гайд тоді
-
Будуємо image контейнеру docker build -t IMAGE_NAME .
-
Будуємо instance контейнеру
-v /local_path/to/data:/data \
лише якщо вам треба VOLUME
docker run -it -d \
-v /local_path/to/data:/data \
IMAGE_NAME
Результат виконання команди - DOCKER_ID який треба буде використовувати в інших командах
-
Завалилась якась команда при build Закомментовуєте все в Dockerfile від заваленої команди і вниз (включаючи з заваленною командою) створюєте контейнер 'docker exec -t -i DOCKER_ID /bin/bash' І пробуєте ту саму команду (без
RUN
) ручками Коли запрацює, підфіксіть команду в Dockerfile -
Завалилась сама аппка
Варіант 1
docker logs DOCKER_ID
Варіант 2
Комментуєте CMD
build
create instance
docker exec -t -i DOCKER_ID /bin/bash
І пробуєте запустити команду і подивитись інтерактивно
Фіксите Dockerfile, пробуєте
Майте на увазі. Якщо команда CMD впаде, то впаде і контейнер. Це так задумано для моніторингу. Не тягніть в контейнер pm2, nodemon чи щось інше
-
Зупинити контейнер
docker stop DOCKER_ID
-
Стартувати зупинений контейнер
docker start DOCKER_ID
Лише під час розробки контейнеру, потім нафіг не потрібно
Не загальноприйнята практика, але. Створіть собі наступні файли
- 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