Как я могу запустить команду Docker после сборки? - PullRequest
0 голосов
/ 08 июля 2020

У меня есть Dockerfile:


FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt-get update -y
RUN apt-get install -y python3.7 build-essential python3-pip
RUN pip3 install --upgrade pip
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8
ENV FLASK_APP application.py
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
EXPOSE 5000
ENTRYPOINT python3 -m flask run --host=0.0.0.0

Но я хочу также запустить python3 download.py перед запуском ENTRYPOINT. Если я помещаю его сюда, а затем build, он выполняется здесь. Мне нужно, чтобы он выполнялся только на ElasticBeanstalk.

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 08 июля 2020

Существует схема использования Docker ENTRYPOINT для выполнения первоначальной настройки, а затем запуска CMD. Например, вы можете написать сценарий точки входа, такой как

#!/bin/sh

# Do the first-time setup
python3 download.py

# Run the CMD
exec "$@"

Поскольку это сценарий оболочки, вы можете включить сюда любой лог c или дополнительные настройки, которые вам нужны.

В вашем Dockerfile , вам нужно изменить строку ENTRYPOINT на CMD, COPY в этом скрипте и установить ее как ENTRYPOINT.

...
COPY . /app
...

# If the script isn't already executable on the host
RUN chmod +x entrypoint.sh

# Must use JSON-array syntax
ENTRYPOINT ["/app/entrypoint.sh"]

# The same command as originally
CMD python3 -m flask run --host=0.0.0.0

Если вы хотите отладить это, поскольку это setup учитывает «командную» часть, вы можете запустить одноразовый контейнер, который запускает интерактивную оболочку вместо процесса Flask. Это по-прежнему будет выполнять первоначальную настройку, но затем выполните команду из команды docker run вместо того, что было в строке CMD.

docker run --rm -it myimage bash
1 голос
/ 09 июля 2020

Вы можете контролировать, запускаете ли вы python3 download.py, используя переменные среды. А затем запускаете локально, вы делаете docker run -e....

...