Ответы пользователя по тегу Docker
  • Как выполнять комманду exec (docker-compose), чтобы файлы созданные впоследствие нее пренадлежали текущему пользователю на хост машине?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Коль вы не даёте конкретно запускаемую вами команду и содержимое конкретно ваших docker/compose-файлов, то вот вам соответствующий вопросу ответ: у вас где-то ошибка, потому что работать должно.
    user@user-workstation:/tmp/test$ docker container run --rm -v ${PWD}:/tmp -u $(id -u ${USER}):$(id -g ${USER}) ubuntu:18.04 touch /tmp/it.is.my.file
    user@user-workstation:/tmp/test$ ll
    итого 20
    drwxrwxr-x  2 user user   4096 янв 22 13:55 ./
    drwxrwxrwt 23 root root  16384 янв 22 13:55 ../
    -rw-r--r--  1 user user      0 янв 22 13:55 it.is.my.file
    user@user-workstation:/tmp/test$ rm it.is.my.file 
    user@user-workstation:/tmp/test$ docker container run --rm -v ${PWD}:/tmp ubuntu:18.04 touch /tmp/it.is.my.file
    user@user-workstation:/tmp/test$ ll
    итого 20
    drwxrwxr-x  2 user  user   4096 янв 22 14:01 ./
    drwxrwxrwt 23 root  root  16384 янв 22 14:01 ../
    -rw-r--r--  1 root  root      0 янв 22 14:01 it.is.my.file
    user@user-workstation:/tmp/test$
    Ответ написан
    1 комментарий
  • Как добавить строчку записи в конец файла /etc/hosts в докерфайле?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Цель задачи: необходимо, чтобы вместо "127.0.0.1:8080" можно набить в адресной строке http://test, те http://127.0.0.1:8080=http://test

    Чтобы решить эту задачу, вам надо сделать 2 вещи:
    1) руками в hosts-файл на вашей хост-машине добавить строчку 127.0.0.1 test. Так вы решите вопрос с именем хоста (test вместо IP 127.0.0.1)
    2) при старте контейнера с веб-сервером биндить порт веб-сервера из контейнера с 80-м портом вашей хост-машины (с помощью параметра --publish): что-то типа docker run --publish 80:8080 ... - здесь как бы написано: "связать внутренний порт контейнера 8080 с внешним портом хост-машины 80" (в вашем случае вроде как оба порта будут 80, и внутренний, и внешний).
    Если внешний порт, с помощью которого вы хотите смотреть веб-сайт, отличается от дефолтного (80 для HTTP и/или 443 для HTTPS) - никакими прописываниями ни в каких магических файлах не получится избавиться от указания порта при набирании адреса в адресной строке браузера.
    И ещё - если у вас на хост-машине есть что-то, что уже слушает 80-й порт - ну мало ли, может nginx какой запущен или тот же апач - то связать порты не выйдет, нужно сначала остановить тот сервис, что сидит на 80-м порту. Ну или не париться и использовать любой другой порт.

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

    И скажите: откуда вообще изначально взялась такая потребность? Если чисто сделать красивый адрес для использования локально в процессе разработки - ну ок, хотя можно и без этого. Если вы делаете это уже для продакшна - то всё, что вы описали в вопросе - не то, не так и не в ту сторону.
    Ответ написан
    1 комментарий
  • Что за магия в работе Celery с использованием Docker?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Воу-воу, сам на днях буду переносить celery в docker.
    Но ваш вопрос немного не о том. Он скорее о понимании, как вообще работает celery.

    Неужели все содержимое такса каким-то образом передается через брокер и ему неважно, где располагается код? Или передается только имя+сигнатура.

    Только описание, какое задание надо выполнить, с какими входными параметрами. Никакого кода не передаётся.

    Возьмём Django + Celery.
    Типичный, описанный в документации и используемым самим celery для интеграции с django, шаблон использования таков: вы создаёте в django-приложениях файл tasks.py, в котором создаются функции, декорируемые @task. В этих функциях вы описываете логику этих заданий.

    В таком случае, веб-приложение и воркеры используют один и тот же код. И в контейнеры django_web и celery_worker надо упаковывать одно и то же. Просто запускаться это будет по разным сценариям: django_web будет обрабатывать http-запросы, celery_worker будет обрабатывать поступающие задания.
    Ответ написан