Я создаю файл docker-compose.yml, который создает мой собственный Dockerfile, и мне нужно сначала выполнить команду bash в моей хост-системе, а затем передать результаты в качестве аргумента сборки для Dockerfile .

Вот пример из практики:

Dockerfile:

#...
ARG SSH_KEY_BASE64
RUN echo "Build SSH_KEY_BASE64: $SSH_KEY_BASE64"
#...

docker-compose.yml:

#...
version: '3.4'

services:
  container:
    container_name: my-container
    build:
      context: .
      dockerfile: Dockerfile
      args:
        SSH_KEY_BASE64: ${SSH_KEY_BASE64_COMMAND}
    env_file: .env
#...

.env:

SSH_KEY_BASE64_COMMAND=$(cat ~/.ssh/id_rsa_mykey | base64)

На данный момент значение $SSH_KEY_BASE64 в Dockerfile не определено, и он печатает только $(cat ~/.ssh/id_rsa_mykey | base64), но я хочу, чтобы он оценил эту команду и распечатал base64 содержимого моего ключ .

Я бы не хотел запускать $(cat ~/.ssh/id_rsa_mykey | base64) вручную перед запуском docker-compose up --build, поэтому я прошу сделать это автоматически.

Какие у меня есть варианты?

Благодарность

0
Briston12 13 Фев 2021 в 11:56

1 ответ

Лучший ответ

Compose не поддерживает этот синтаксис и не может напрямую выполнять команды в хост-системе. Единственный поддерживаемый синтаксис замены: Синтаксисы раскрытия переменных среды $VARIABLE, ${VARIABLE}, ${VARIABLE:-default} и ${VARIABLE:?error}, и это только в основном файле docker-compose.yml. Значения в env_file: файл вообще не интерпретируется и не раскрывается.

В большинстве случаев вы на самом деле не хотите создавать образ, который зависит от конкретной хост-системы, на которой он построен; изображение предназначено для повторного использования в нескольких средах. В конкретном случае ssh-ключа особенно опасно передавать его как ARG, поскольку его довольно легко извлечь из окончательного изображения (docker-compose run container cat /root/.id_rsa). Возможно, вам потребуется выполнить любую операцию, требующую ssh-ключа (например, аутентифицированный git clone) в хост-системе за пределами Docker.

Единственный обходной путь - установить переменную среды хоста и вместо этого ссылаться на нее, но, вероятно, лучше полностью избавиться от ARG.

1
David Maze 13 Фев 2021 в 11:49