оптимизировать многократное выполнение одной и той же команды - Docker - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь установить и настроить postgresql-client-11 на моем ubuntu18:04. Я понимаю, что нам нужно выполнить несколько дополнительных шагов, показанных ниже, чтобы сделать то же самое (Источник: https://www.itzgeek.com/how-tos/linux/ubuntu-how-tos/how-to-install-postgresql-10-on-ubuntu-18-04-lts.html)

wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O- | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" | sudo tee /etc/apt/sources.list.d/postgresql.list
sudo apt-get update
sudo apt-get install -y postgresql-client-11

Я достигаю этого с помощью следующего

RUN apt-get update && apt-get dist-upgrade -y && apt-get install -y wget && apt-get install -y gnupg2
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" | tee /etc/apt/sources.list.d/postgresql.list
RUN wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
RUN apt-key add ACCC4CF8.asc
RUN apt-get update && apt-get dist-upgrade -y && DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs && rm -rf /var/lib/apt/lists/*

Я выполняю одну и ту же команду RUN apt-get update && apt-get dist-upgrade -y дважды.

Есть ли способ оптимизировать вышеуказанное и не иметь избыточных команд .

1 Ответ

1 голос
/ 02 марта 2020

Вы можете немного подправить это, но в основном вам нужно две RUN apt-get update && apt-get install строки. Существенная цепочка зависимостей:

  • Последняя строка apt-get install зависит от наличия доступного репозитория PostgreSQL в восходящем направлении
  • Вы не можете apt-get install из репозитория, пока вы не apt-get update из него
  • Вы не можете сделать это apt-get update без предыдущих строк, чтобы добавить строку sources.list и загрузить ключ c publi
  • Вы не можете получить ключ publi c без wget и gnupg
  • Для которого требуется дополнительный apt-get install и предшествующий apt-get update

Нет особой необходимости дважды запускать dist-upgrade и я пропущу его в первый раз (и, может быть, во второй раз: образ Docker Hub ubuntu обновляется довольно регулярно). Вы можете объединить несколько команд apt-get install вместе, и если у вас есть предложение rm, вам нужно запускать его каждый раз. Вы также можете подумать, нужна ли вам клиентская библиотека новее, чем пакеты Ubuntu; если старая клиентская библиотека будет работать нормально, вы можете значительно упростить это.

Так что я могу оказаться где-то вроде:

# Install prerequisites to install prerequisites
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends --assume-yes \
      gnupg2 \
      wget \
 && rm -rf /var/lib/apt/lists/*

# Configure upstream PostgreSQL repository
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" | tee /etc/apt/sources.list.d/postgresql.list \
 && wget https://www.postgresql.org/media/keys/ACCC4CF8.asc \
 && apt-key add ACCC4CF8.asc

# Actually install the packages we need
RUN apt-get update && \
 && DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y \
 && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends --assume-yes \
      nodejs \
      postgresql-client-11 \
 && rm -rf /var/lib/apt/lists/*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...