Docker: установите пользовательский порт в качестве переменных env во время выполнения, а не сборки

#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 внутри контейнера.