Согласно документации Docker:
docker-compose up
runs a one-time command against a service. [...]
Команды, которые вы используете с
docker-compose run /path/to/script.sh
start in new containers with configuration defined by that of the service, including volumes, links, and other details. However, there are two important differences.
Сначала команда прошла мимо
docker-compose run
overrides the command defined in the service configuration. [...]
Второе отличие состоит в том, что
docker-compose run bash
command does not create any of the ports specified in the service configuration. This prevents port collisions with already-open ports. If you do want the service’s ports to be created and mapped to the host, specify the --service-ports flag:
docker-compose -f <FILE> up --detach
В качестве альтернативы можно указать ручное сопоставление портов с помощью
docker-compose run
or docker-compose run --publish 8080:80 -p 2022:22 -p 127.0.0.1:2021:21 web python manage.py shell
параметры, как и при использовании docker run:
-p
Это означает, что вы можете запускать отдельные команды для уже определенной службы или служб, используя
--publish
.
Например, предположим, что вы настроили составной файл, который определяет какой-то сервис. Чтобы запустить службу для работы в фоновом режиме, вы используете
docker-compose run --service-ports web python manage.py shell
but if you wanted to look inside the container using a terminal, you would run
docker-compose run
.
Причина игнорирования портов:
run
assumes the container is already set up, and has it's ports set up correctly. If you ran a script that did something involving ports using
run
возможно, вы не захотите, чтобы он менял порты, которые были правильно сопоставлены с вашим
docker-compose run
command. This way, the option makes it so you have to tell docker explicitly "I actually want port mappings to change".