Удалить переменную среды из образа докера - PullRequest
1 голос
/ 22 марта 2019

Я просмотрел онлайн и попробовал очевидный маршрут (объясненный ниже), чтобы удалить переменную окружения из образа докера.

1 - я создаю контейнер из модифицированного образа Ubuntu, используя:

docker run -it --name my_container my_image

2 - я проверяю изображение и вижу две переменные окружения, которые я хочу удалить, используя:

docker inspect my_container

что дает:

...
    "Env": [
        "env_variable_1=abcdef",
        "env_variable_2=ghijkl",
        "env_variable_3=mnopqr",
...

3 - я выполняю exec в контейнер и удаляю переменные окружения с помощью:

docker exec -it my_container bash
unset env_variable_1
unset env_variable_2

4 - Я проверяю, чтобы указанные переменные исчезли:

docker inspect my_container

что дает:

...
    "Env": [
        "env_variable_3=mnopqr",
...

5 - я затем фиксирую этот измененный контейнер как изображение через:

docker commit my_container my_new_image

6 - и проверить наличие удаленных переменных среды с помощью:

docker run -it --name my_new_container my_new_image
docker inspect my_new_container

что дает (барабанная дробь, пожалуйста):

...
    "Env": [
        "env_variable_1=abcdef",
        "env_variable_2=ghijkl",
        "env_variable_3=mnopqr",
...

AKA удаленные переменные не переносятся из измененного контейнера в новое изображение в docker commit

Что мне здесь не хватает? unset действительно удаляет переменные? Должен ли я использовать другой метод для удаления этих переменных среды или другой / измененный метод для фиксации контейнера как изображения?

PS: я подтвердил, что переменные вначале существуют, когда внутри контейнера через env. Затем я подтвердил, что они не были активны, используя тот же метод после использования unset my_variable

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Вам нужно отредактировать Dockerfile, который создал исходное изображение.Директива Dockerfile ENV имеет несколько различных синтаксисов для установки переменных, но не один для их сброса.docker run -e и Docker Compose environment:, настройка также не может этого сделать.Это не особенно распространенный вариант использования.

В зависимости от того, что вам нужно, может быть достаточно установить переменные в пустое значение, хотя это технически отличается.

FROM my_image
ENV env_variable_1=""
RUN test -z "$env_variable_1" && echo variable 1 is empty
RUN echo variable 1 is ${env_variable_1:-empty}
RUN echo variable 1 is ${env_variable_1-unset}
# on first build will print out "empty", "empty", and nothing

Большим молотом является использование сценария точки входа для сброса переменной.Сценарий будет выглядеть так:

#!/bin/sh
unset env_variable_1 env_variable_2
exec "$@"

Он будет связан с Dockerfile, например:

FROM my_image
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["same", "as", "before"]

docker inspect будет по-прежнему отображать переменную как заданную (поскольку она находится в контейнереметаданные), но что-то вроде ps e, которое показывает фактическую среду процесса контейнера, покажет его неустановленным.

Как правило, вы всегда должны использовать систему docker build для создания изображения, а никогда использовать docker commit.(«Модифицированный образ Ubuntu» на самом деле не является воспроизводимым рецептом для отладки или обращения за помощью, или для его восстановления, когда через шесть месяцев появится критическое исправление безопасности.) docker inspect не является по сути вредным, но имеет очень многобесполезной информации;У меня редко есть причина использовать это.

1 голос
/ 22 марта 2019

Может быть, вы можете попробовать таким способом, как в этот ответ :

docker exec -it -e env_variable_1 my_container bash

И затем зафиксировать контейнер как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...