Ответы пользователя по тегу Docker
  • По какой причине проявляется ошибка внутри докера? как можно его пофиксить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    А вот что именно должна делать команда

    ${WEBPACK_COMMAND:- ng build --configuration=production}


    и почему удивляет, что она завершается некорректно? Определена ли вообще переменная $WEBPACK_COMMAND? Почему при сборке вообще потребовалось брать название команды из внешней переменной? Тут вообще работают bash-евые подстановки в командах (подозреваю что нет, но не проверял)? Может, там и shell в базовом образе не bash, а классический sh?

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

    До кучи, тут CMD - это команда, запускаемая при старте контейнера. Но по логике этого докерфайал, эта команда предполагалась к запуску только при сборке образа. Чтоб это исправить, надо поменять CMD на RUN.

    Что будет при неуказании CMD запускаться в создаваемом на базе этого образа контейнере будет в таком случае унаследовано из FROM node:14-alpine, в данном случае видимо это запуск nginx. Если нужно запускать что-то своё вместо дефолта, то CMD надо переопределить на команду реального запуска приложения (типа CMD node /path/to/app.js или что там у вас в node.js принято делать для запуска?),

    Ну и делать внутри образа две копии приложения тоже немного странно. Лучше или собирать приложение сразу в конечном каталоге /usr/share/nginx/html, либо изменить конфиг nginx на использование другого каталога. Скорее всего, в этом образе - как и в официальном образе nginx - конфиг лежит в /etc/nginx/conf.d/default.conf.

    А ещё более хорошо и правильно освоить multi stage build в докере.
    Ответ написан
  • Как привязать postgis к postgres в docker?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно просто использовать образ postgis вместо образа postgres. Образ postgis/postgis унаследован от postgres и вполне его заменяет.
    Ответ написан
    2 комментария
  • Сколько места доступно докер контейнеру на linux?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Docker по умолчанию использует "слоённую" файловую систему overlayfs. В ней каждый образ состоит из нескольких слоёв, которые перекрывают друг друга (read only). Плюс собственный слой контейнера (read write). Поэтому если никакой большой записи приложение в контейнере не ведёт, то образ на диске хранится один раз и дополнительно место почти не расходуется. Это нормально, это так и задумано.
    Ответ написан
    Комментировать
  • Почему Zabbix agent подключается к не понятным IP?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    172.17.0.1 это обычно локальный IP интерфейса docker0. Вся сеть 172.17.0.0/24.

    Модно посмотреть вывод ip addr list dev docker0 и docker network ls, чтобы убедиться.
    Ответ написан
    4 комментария
  • Как держать контейнер работающим после запуске стартового скрипта .sh?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Надо убрать & из команды. Серьёзно, при запуске приложения в контейнере вообще не нужно никак уводить его выполнение в фоновый режим.

    До кучи, при запуске в контейнере не имеет смысла перенаправлять вывод в /dev/null, поскольку чаще всего удобнее, что можно посмотреть вывод приложения командой docker logs.
    Ответ написан
    1 комментарий
  • Как пробросить webhook Telegram бота на домашний компьютер через виртуальный сервер с OpenVPN и Docker?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Первое и очень простое решение - можно вообще не использовать вебхуки для тестового бота. Например, пусть у нас будет в конфиге опция, по которой мы запускаем либо сервер для вебхуков, либо поллинг:

    import config
    
    if __name__ == '__main__':
        if config.POLLING:
            ... start_polling
        else:
            start_webhook(...


    Всё-таки основная часть бота - его бизнес-логика. Каждый раз проверять работу его вебхуков необязательно.

    Если всё же хочется вебхуков, то организуем VPN по любой инструкции, коих тысячи, получаем туннель с парой IP. Например, 10.10.10.1 на сервере и 10.10.10.2 локально. На сервере поднимаем nginx, в котором настраиваем что-то типа
    location /path/to/api_test {
      proxy_pass http://10.10.10.2:порт/path/to/api_test
    }


    Обязательно настраиваем https, можно с Let's Encrypt, но можно и с самоподписанным сертификатом. В последнем случае надо будет загрузить этот сертификат в Telegram через API при настройке вебхука.

    Локально у себя пробросить в докере тот самый порт в нужный контейнер с ботом.

    Возможны разные вариации, не изменяющие общий принцип. Например, можно не настраивать https на сервере, пробросить весь порт "как есть" через nginx stream, haproxy, двойной нат или нат с policy routing, а сам https настраивать у себя локально.
    Ответ написан
    Комментировать
  • Почему postgresql создаёт ещё одну директорию?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что внутри образа postgres:13.3 анонсируется том /var/lib/postgresql/data. Поскольку он никак не описан при создании контейнера, создаётся анонимный том в стандартном хранилище и монтируется в контейнер. То, что в манифесте также объявлен ещё один том, никак не влияет на автосоздание вот этого. В итоге у нас два тома, один описан явно и смонтирован в /app/app/database/pgdata, другой описан в образе и смонтирован в /var/lib/postgresql/data.

    Правильно монтировать свой том в /var/lib/postgresql/data, именно там образ будет хранить базу.

    Посмотреть, что думает образ, можно командой docker inspect postgres:13.3
    Ответ написан
    Комментировать
  • Как исправить эту ошибку docker-compose?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Идём сюда: archive.ubuntu.com/ubuntu/dists и видим, что там нет релиза hirsute. Зато он есть тут: https://old-releases.ubuntu.com/ubuntu/dists/ , так что меняем archive.ubuntu.com на old-releases.ubuntu.com. Ещё лучше, конечно, обновить Dockerfile на более новую версию убунты, но может потребоваться разобраться в разных нюансах (какой-нить пакет иначе называется, какие-то конфиги в другом месте лежат и всякое такое).
    Ответ написан
    4 комментария
  • Как заставить volumes Docker compose не затирать данные из контейнера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Запись

    - src:/var/www/html

    создаёт именованный том src в хранилище (docker volume ls). Надо указывать путь к каталогу, например, как относительный: ./src.

    В образе по-хорошему ничего не надо заранее класть в этот каталог. Если нужно, чтобы в том попали какие-то данные, то их можно туда, например, распаковать при первом запуске контейнера из заготовленного архива. Но это в принципе считается антипаттерн, докер предполагает, что контейнер - не обёртка для запуска снаружи подсунутого содержимого - а законченное приложение.
    Ответ написан
    Комментировать
  • Какой подход правильный в описании docker-compose?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    1. Очень сильно зависит от задачи. Конечно, если точно не понимаешь, зачем это тебе нужно, то имеет смысл доверить настройку сети докеру. Но если надо, чтобы вместо bridge был macvlan со строго заданной сетью и конкретным parent-интерфейсом, то этим нас докер сам не обеспечит, если ему не подсказать.

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

    3. Это попытка бороться с довольно типичным подходом начинающих докероводов, которые обходятся "универсальным" контейнером, исполняющим любой php-код с внешнего каталога. Конечно, для быстрых экспериментов "ща я чёта сваяю и запущу для проверки" это даже не очень плохое решение, но при широком использовании такого подхода смысл докера существенно уходит: вместо готового к разворачиванию приложения мы имеем контейнер, который ничего не умеет и которому приходится самостоятельно пилить отдельную систему доставки самого кода. Вместо этого лучше сразу научиться и отладиться готовить полноценный образ. В конце концов, можно все приложения делать потомками этого супер-образа с php, что сделает их сборку довольно быстрой.

    4. Относительные пути - это как раз очень удобно для многих задач. Мы имеем каталог с проектом, в котором docker-compose.yml и все нужные данные. Размещение данных предсказуемо, точно видно, кто их использует, какой у них размер и всё такое. Удобно в случае чего перекидывать между серверами вместе с данными: просто погасил, rsync, запустил. Напротив, хранение данных в анонимных томах в /var/lib/docker с непонятными именами - это часто антипаттерн, при котором ценное место в /var заполняется чем-то непонятным, что толком невозможно идентифицировать. А использование имён может привести к той же проблеме, что и container_name - в разных compose-проектах имена пересекутся, и узнаешь это только тогда, когда уже сломается.
    Ответ написан
  • Как выполнить еще одну команду в docker?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это считается не docker-way (правильнее в отдельном контейнере запустить отдельный обработчик очереди), но можно так:

    одна команда & другая команда

    Можно также сделать скрипт, который всё как надо запустит, и использовать его в качестве cmd. Можно также внедрить в контейнер микросистему управления сервисами типа runit.

    Почему считается, что плохо так делать? Если php-fpm упадёт, то весь контейнер упадёт и может перезапуститься автоматом. А если упадёт второй сервис, то контейнер будет работать как ни в чём не бывало.
    Ответ написан
    Комментировать
  • Как задать динамичные параметры в Makefile?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    make принимает список отдельных целей для сборки, там нельзя передать параметр на несколько слов. Можно передавать define через -D, например:

    make -DARGS="UserSeeder" seed

    В Makefile:

    seed:
      docker-container exec php php artisan make:seed $(ARGS)


    Но в целом проще написать свой скрипт, чем сражаться с ограничениями make.
    Ответ написан
    5 комментариев
  • Как создать контейнер в docker чтобы файлы брались из внешней директории?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Аналог package.json - файл requirements.txt для pip или аналоги для других систем типа pipenv.

    Делаем контейнер, в который добавляем наш код, как-то так:

    ADD app /app
    WORKDIR /app
    RUN apt install python3-pip && pip install -r requirements.txt

    Затем при запуске контейнера передаём ему каталог с нужными каталогами (в данном случае конфиги и логи):

    docker run -itd --name my_service -v `pwd`/config:/app/config:ro -v /var/log/my_project/my_service:/app/log my_awesome_image


    Или через секцию volumes в docker-compose.yml (с ним удобнее, чем с прямым вызовом docker):

    volumes:
        - ./config:/app/config:ro
        - /var/log/my_project/my_service:/app/log
    Ответ написан
    1 комментарий
  • Если удалить образ, который используется в контейнере, то почему контейнер не падает?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Образ - это не какой-то набор файлов. Это по сути список слоёв (fslayer), которые могут быть общими у разных образов. Имя образа (с тэгом) - это ссылка на id образа. У образа может быть несколько имён (например, foobar:1.2.3 и foobar:latest). Удаление образа по имени имени не удаляет образ, оно удаляет лишь имя, затем если у id образа больше нет других имён и образ не используется больше никем удаляет те fslayer образа, которые заведомо не нужны другим образам и контейнерам. Поэтому иногда docker rmi говорит всего лишь "untagged имя_образа", а иногда реально удаляет какие-то слои.

    $ docker pull alpine
    Using default tag: latest
    latest: Pulling from library/alpine
    540db60ca938: Pull complete 
    Digest: sha256:69e70a79f2d41ab5d637de98c1e0b055206ba40a8145e7bddb55ccc04e13cf8f
    Status: Downloaded newer image for alpine:latest
    docker.io/library/alpine:latest
    $ docker tag alpine foo/bar/lorem/ipsum:some.tag
    $ docker rmi alpine
    Untagged: alpine:latest
    Untagged: alpine@sha256:69e70a79f2d41ab5d637de98c1e0b055206ba40a8145e7bddb55ccc04e13cf8f
    $ docker rmi foo/bar/lorem/ipsum:some.tag
    Untagged: foo/bar/lorem/ipsum:some.tag
    Deleted: sha256:6dbb9cc54074106d46d4ccb330f2a40a682d49dda5f4844962b7dce9fe44aaec
    Deleted: sha256:b2d5eeeaba3a22b9b8aa97261957974a6bd65274ebd43e1d81d0a7b8b752b116


    При создании контейнера поверх слоённой файловой системы образа создаётся новый слой для собственных файлов контейнера. Поэтому физически образ нельзя до конца удалить, пока есть хоть один контейнер на его базе.
    Ответ написан
    2 комментария
  • Как запустить докер с бинарником скомпилированным из го?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Почему в ENTRYPOINT делается chmod? Надо просто ./client или даже полный путь /app/client.
    Ответ написан
  • Traefik docker создает самоподписанные ssl сертификаты. Как отключить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для этого порт надо пробрасывать как tcp, не http/https.

    Но вообще-то это неправильная практика. Как раз на прокси/балансеры и вешают сертификат в таких случаях, а дальше терминируют трафик на http или на https с любым сертификатом.
    Ответ написан
    3 комментария
  • Django & PostgreSQL MemoryError + не правильная работа скрипта?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как тут уже правильно заметили, не надо ловить все Exception без разбору и даже не выводить никакой ошибки. Ничего хорошего от этого антипаттерна не получится.

    Как минимум следует начать хотя бы с такого:

    try:
      ...
    except Exception as e:
      print (e)


    Сейчас же, возможно, случается Exception, но мы этого даже не знаем.

    Далее, не стоит использовать ORM вперемешку с обычными запросами. Это тоже источник потенциальных проблем, ведь ORM может кэшировать данные, в том числе ещё не сохранённые. Возможно, до вызова save случился Exception, данные в кэше отличаются от данных в базе, но при прямом запросе в базу мы получим не то же самое, что получили бы из кэша.

    Вот такие мелочи могут создавать проблемы, которые при этом вообще нигде даже не отражается. И это ещё повезло, что эффект такой заметный. А если бы эффект проявлялся в одном случае из тысячи? Как бы его потом ловить и что отвечать пользователям, с которых списали лишних денег?
    Ответ написан
    Комментировать
  • Что я упускаю при руссификации консоли?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В отличие от Debian, в Ubuntu файлы локализации вынесены в отдельный пакет language-pack-ru, установка которого решает проблему.
    Ответ написан
    Комментировать
  • Как ускорить docker push?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это невозможно. В принципе. Слой загружается на сервер только целиком, нельзя проверять, что в нём отличается только один файл. Тем более отличаться будет не только файл, но и, например, каталог, в который его положили - у него изменится mtime. Всё это отслеживается через контрольную сумму архива слоя, она от любого нового файла меняется.
    Ответ написан
    Комментировать
  • Можно ли использовать Fail2Ban из докера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ну как бы это вполне возможно. Нужно --net=host, чтобы fail2ban редактировал iptables на хосте, нужно прокинуть (или загнать в образ) конфиг, нужно прокинуть изучаемые им логи, ну и про privileged mode не забыть. Но зачем? Ему же по сути только конфиг надо настроить один раз и везде использовать, вон уже выше ansible посоветовали для упрощения этой операции.
    Ответ написан
    Комментировать