#docker
#docker
Вопрос:
файл docker
FROM flask:1.0
COPY ./ /app
WORKDIR /app
# install commands
RUN DEBIAN_FRONTEND=noninteractive apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y sudo
#RUN DEBIAN_FRONTEND=noninteractive apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y curl
#installing sql server odbc
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y apt-utils
#install python stuff
RUN pip3 install -r requirements.txt
ENTRYPOINT [ "python3" ]
#start server
ARG PORT=8004
ENV PORT=$PORT
#start server
EXPOSE ${PORT}
# RUN chmod x src/entrypoint.sh
RUN chmod x entrypoint.sh
# ENTRYPOINT [ "gunicorn", "-w", "4", "-b", "0.0.0.0:8004", "--chdir", "src", "wsgi:app" ]
ENTRYPOINT ["./entrypoint.sh"]
файл точки входа
#!/bin/sh
gunicorn -w 4 -b 0.0.0.0:$PORT --chdir src wsgi:app
итак, в настоящее время, когда я создаю образ docker и передаю значение порта 8005 во время сборки, а затем запускаю его с 8005, контейнер запускается с портом 8005.
Create docker image:
docker build -t test:1.0 . --build-arg PORT=8005
Run docker container: docker run -p 8005:8005 -d test:1.0
НО мне нужно передать порт во время ВЫПОЛНЕНИЯ, а не во время сборки (это не работает и занимает 8004)
Create docker image:
docker build -t test:1.0 .
Run: docker run -p 8005:8005 -d test:1.0 -e PORT=8005
Комментарии:
1. Зачем беспокоиться? Вы можете выбрать порт хоста (левая сторона
-p
аргумента) по вашему выбору, независимо от того, какой порт прослушивает служба в контейнере. Таким образом, вы можете-p 8004:8005
предоставить доступ к службе через порт 8004 на хосте или-p 1234:8005
предоставить доступ к службе через порт 1234 на хосте и т. Д. Просто оставьте саму конфигурацию контейнера статичной.2. должен ли я что-либо менять в файле docker? @larsks вы говорите, что ниже работает? docker run -p 8004: 8005 -d тест: 1.0
3. Я говорю, что вам не нужно изменять конфигурацию контейнера, чтобы предоставить сервис на выбранном вами хост-порту. Что-то вроде того, что вы опубликовали в своем комментарии, должно работать нормально, если предположить, что ваша служба прослушивает порт 8005 в контейнере.
Ответ №1:
Проблема в том, что вы передаете -e port
команду не docker run
команде, а тому, что выполняется в контейнере.
Должно сработать следующее,.
docker run -p 8005:8005 -d -e PORT=8005 test:1.0
Например, если вы запустите :
docker run -p 8005:8005 -d -e PORT=8005 test:1.0 ls
Он будет выводить содержимое workdir внутри контейнера.