Задать вопрос
  • Как создавать новый image в dockerfile и нужно ли?

    shurshur
    @shurshur
    Владимир, а, прочитал тот вопрос ещё раз и написал туда в комментарии.
  • Как импортировать бэкап в mongo?

    shurshur
    @shurshur
    Владимир,
    в Dockerfile есть два способа передать переменную окружения:

    ARG - переменная передаётся на этапе сборки;
    ENV - переменная передаётся в создаваемый на базе собранного образа контейнер.

    Если надо что-то передать на этапе сборки, то следует использовать ARG.

    Что касается исхождной ошибки, скорее всего, контейнера с id b2fb5a13f4d8 сейчас не существует. Я бы посмотрел в вывод docker ps, возможно у него другой id сейчас. И вообще, часто удобнее обращаться к контейнерам по именам.
  • Как создавать новый image в dockerfile и нужно ли?

    shurshur
    @shurshur
    Владимир, посмотрел, не очень понимаю в js, process.env это переменные окружения текущего процесса? Скорее всего, надо было их передать правильно в контейнер. Самое простое - записать их в файл, а в docker-compose.yml добавить в env_file.

    env_file:
      - path/to/my.env


    Я сам раздаю статику отдельной нодой


    Тем не менее, вряд ли нода раздаёт статику так же быстро и эффективно, как nginx, который 20 лет писали на C и затачивали под самые высоконагруженные проекты.

    В любом случае, если есть 10 приложений, никто не делает 10 отдельных серверов под каждое, это явный перебор, а это значит, что придётся научиться обычным практикам по разруливанию этого хозяйства, а обычная практика это чаще всего nginx в качестве обратного прокси.

    Это если настраивает не такой как я


    Если у вас там серьёзный проект, то настраивать прод будет не js-программист, а опытный админ. Но даже так, обычно почти не нужно ничего менять из дефолтных значений в типовом конфиге, кроме специальных случаев типа вебсокетов. Которые обычно по гуглу настраиваются вполне приемлемо и дальше годами используются без изменений. Я сам никогда этого не помню и лезу в гугл.
  • Как создавать новый image в dockerfile и нужно ли?

    shurshur
    @shurshur
    Владимир, как именно используется process.env?

    То есть я могу собрать проект один раз, изменить докер файл ссылаясь на него, а не на node:16 например и у меня не будет заниматься место?


    Не совсем. Каждый образ имеет "слоёную" файловую систему, где в каждом слое лежат какие-то файлы (или информация об их удалении), итоговый образ составляется из этих слоёв, а конкретный контейнер - это ещё один слой поверх слоёв образа. Поэтому если создать много контейнеров из одного образа, то они по сути будут занимать столько места, сколько в них файлов, отличающихся от базового образа (конечно же, туда добавятся и некоторые небольшие организационные расходы).

    Для реализации слоёной файловой системы изначально в докере использовалась aufs2, файловая система с исторически тяжёлой судьбой и всяческими глюками. Сейчас же по умолчанию используется overlayfs, хотя можно использовать и другие storage driver.

    Если образ делается из node:16, то содержимое node:16 на диске хранится один раз. Если в наших проектах есть ндцать модулей, которые используются во всех приложениях, то можно сделать свой базовый образ как потомок node:16, в который будут заранее установлены основные зависимости, тогда дочерние образы приложений могут занимать меньше места, а их сборка сократится, благодаря тому, что общие модули установлены в базовый образ заранее.

    Вообще, можно на досуге полазать по /var/lib/docker (естественно, ничего трогать там не надо, только смотреть!) и поизучать вывод docker inspect по конкретным образам и контейнерам. Может немножко улучшить понимание того, как это всё устроено. А ещё в выводе команды mount можно увидеть смонтированные слоёные файловые системы...

    Нельзя поднять ноду или докер без него?


    Технически можно. Но практически общепринято проксировать через nginx или какой-либо ещё прокси (haproxy, envoy итд). На то есть несколько соображений:

    1. Можно раскидать запросы по разным приложениям, как для масштабирования/отказоустойчивости, так и для функционального деления (например, запросы /auth обрабатывает одно приложение, а запросы /news другое).

    2. Удобнее обслуживать https с сертификатами.

    3. nginx эффективен для раздачи статики.

    4. nginx очень хорошо написан, его труднее заDOSить или взломать.

    5. Сам по себе nginx требует весьма мало ресурсов, поэтому его использование не даёт практически никаких накладных расходов.
  • Как создавать новый image в dockerfile и нужно ли?

    shurshur
    @shurshur
    Владимир, если речь о том, что в контейнере не видно файлов в текущем каталоге, то это более чем логично, ведь на самом деле для сборки докер создаёт временные контейнеры, внутри которых выполняет все инструкции сборки из Dockerfile. Естественно, внутри этих временных контейнеров своя собственная файловая система, которая наследуется от базового образа и затем поэтапно по мере сборки наполняется файлами через инструкции типа RUN, COPY, ADD.
  • Как создавать новый image в dockerfile и нужно ли?

    shurshur
    @shurshur
    Владимир,
    как понять на базе?


    Допустим, мы берём любой базовый образ, например, ubuntu, и делаем на его базе свой образ с нужным нам софтом. Например:

    FROM ubuntu
    RUN apt-get -y update && apt-get install nodejs && rm -rf /var/cache/apt/*


    (Зачем мы объединяем команды и удаляем кэш я думаю должно быть понятно из предыдущего комментария)

    Соберём этот образ:

    docker build -t my-base:v0.1 -f Dockerfile.my-base .


    Но в целом можно поискать готовый базовый образ с нужной версией node.js в докерхабе. Заодно почитать Dockerfile, чтобы посмотреть, как другие делают.

    Затем в других образах мы можем использовать этот:

    FROM my-base:v0.1
    ADD my_app /app
    WORKDIR /app
    RUN npm install library1 dependency2
    COMMAND node /app/main.js


    Если мы сделаем 10 таких образов с разными приложениями, то их обшая часть - базовый образ - будет одна и та же и не будет занимать отдельного места.

    Можно делать ещё больше разнообразия. Например, пусть у нас часть образов работают с базой данных Oracle. Для этого придётся затащить в образ библиотеки Oracle InstantClient, которые довольно здоровые, да и замороченно их устанавливать каждый раз. Поэтому мы можем сделать образ my-oracle-base, в котором они заранее установлены, чтобы на его базе делать образы приложений, которым нужен доступ к Oracle. Примерно так:

    FROM my-base:v0.1
    RUN apt-get update && apt-get install -y libaio1 wget unzip \
        && wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip \
        && unzip instantclient-basiclite-linuxx64.zip \
        && rm -f instantclient-basiclite-linuxx64.zip \
        && cd /opt/oracle/instantclient* \
        && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci \
        && echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig \
        && npm install oracledb


    (Рецепт установки instantclient подсмотрен тут)

    Это всё просто небольшие примеры, я всё же советую воспользоваться советом из решения ниже и немного изучить основы вкупе с best practices. Это улучшит понимание, ипоможет грамотнее организовать разработку и сборку.
  • Как создавать новый image в dockerfile и нужно ли?

    shurshur
    @shurshur
    Владимир, если слишком намудрить, то и не такое будет. Но вообще большинство ошибок с докером связаны с непониманием того, как он работает.

    Например, такая вот весьма типичная ошибка:

    RUN wget http://example.com/1gb.zip
    RUN rm 1gb.zip


    В этом примере будут созданы два слоя: в одном будет добавлен файл размером 1 Гб, в другом - удалён. Но при этом файл никуда не денется из всех образов, в которых был этот слой. Пусть даже его и не видно теперь в унаследованных образах.

    Решение простое: объединать команды в один слой.

    RUN wget http://example.com/1gb.zip \
        && rm 1gb.zip


    Конечно, чем больше команд слито в 1 RUN, тем сложнее отлаживать сборку. Поэтому можно на этапе отладки разделить на много RUN, а потом пообъединять те команды, которые уже хорошо работают и делают всё как надо.

    Также полезно регулярно проверять вывод команды docker images на предмет всякого остаточного мусора от неудачных сборок и ненужных образов.

    Есть команда docker system prune, которая чистит неиспользуемое, но пользоваться надо очень осторожно, так как она удалит все незапущенные контейнеры, все неиспользуемые образа и тома. Докер по умолчанию сам ничего не удаляет, так как не может угадать, что нам будет ещё нужно в будущем, а что уже неактуально.
  • Как удалить слова из списка в строке, почему не работает?

    shurshur
    @shurshur
    Это пример плохого ответа на вопрос. Не объяснено, что именно было не так, автор вопроса просто скопипастит и у него заработает, а в следующий раз в фразе будет запятая, и он опять прибежит. Что-либо реальное поймёт он только от другого ответа, которые при этом решением не отмечен, хотя заслуживают этого гораздо больше.

    Да и даже если после точки нет пробела, это "решение" тоже сломается...
  • Как скрыть пароль в php-коде?

    shurshur
    @shurshur
    webymax, ну да, у этого решения тоже есть недостатки. Например, если это виртуальных хостинг с кучей сайтов на одном IP, то все эти сайты смогут отправлять через этот сервер (если догадаются посылать через него). Просто это довольно простое решение, и в некоторых случаях именно так и делают.
  • Как скрыть пароль в php-коде?

    shurshur
    @shurshur
    webymax, хотя прочитал остальную переписку и понял, что речь о защите паролей не заказчика, а исполнителя... В общем, есть решение намного проще. У хостинга с сайтом, как правило, фиксированный IP, можно просто разрешить почту с этого IP, например, через relay_networks в postfix, и тогда проблемы с передачей паролей не будет - пароль для отправки с этого IP не нужен.
  • Как скрыть пароль в php-коде?

    shurshur
    @shurshur
    webymax,
    и понимает, что заказчик может передать доступы любому стороннему разработчику


    Это должна быть головная боль заказчика, а не разработчика, что и кому он передаёт и как это всё ломает.
  • Почему простейший ТГ бот не отправляет сообщения в группу?

    shurshur
    @shurshur
    Так напиши подробности, что было неправильно и что надо было изменить, и отметь ответ решением.

    (Подсказка: в url запроса не используется токен)
  • Возможно ли подключение сервера со статическим ip-адресом от другого интернет-провайдера в другой сети другого интернет-провайдера?

    shurshur
    @shurshur
    Возможно. Но будут вопросы с маршрутизацией трафика: нужно будет настроить, что куда пойдёт. В простом варианте отдельные сети маршрутизировать в этого нового провайдера, в более сложном - городить policy routing.
  • Как создавать новый image в dockerfile и нужно ли?

    shurshur
    @shurshur
    Владимир, docker по умолчанию кэширует промежуточные стадии сборки, если не перемудрить, то собираться должно достаточно быстро.
  • Как сделать свой собственный интернет для дома?

    shurshur
    @shurshur
    Константин Фролов, это-то понятно, я просто показывал, во что можно конвертировать три миллиона.
  • Как узнать количество строк с определённым id sqlite3?

    shurshur
    @shurshur
    Если найдётся умник, что напишет ответ на этот наитупейший вопрос из первого же урока по языку SQL из любого учебника или курса, то фу и бяка!
  • Как создавать новый image в dockerfile и нужно ли?

    shurshur
    @shurshur
    image - это образ, а не "изображение".

    Делать 10 докер-файлов более чем нормально. А ещё нормально сделать свой базовый образ с node.js и основными пакетами, которые везде используются, а затем на базе него делать образы под конкретные приложения.
  • Переключение множества карт памяти?

    shurshur
    @shurshur
    eegmak, не нужно относиться к окружающим, как к низшей форме сознания, тем более к тем, кто бесплатно в своё свободное время помогает.
  • Переключение множества карт памяти?

    shurshur
    @shurshur
    eegmak, я вполне серьёзно. Если вместо странных лишённых логики вопросов описать исходную задачу, то ответы будут более конкретны, более эффективны и более целенаправлены.
  • Переключение множества карт памяти?

    shurshur
    @shurshur
    eegmak, не разделяя стиль автора предыдущего комментария, я всё же поддержу его в общей идее: кажется, что переключать десятки microSD это какая-то фигня, которая вряд ли может быть адекватным решением осмысленных задач.

    Так-то я где-то в интернетах видел платы, в которые можно вставлять сразу десяток microSD, что кажется более удобным, чем колхозить переключение карточек. Но смысл вообще какой? Если не хватает объёма одной карточки, то эффективнее купить карточку большего объёма или перейти на флешки/диски.