Как писать файлы в Docker Images? - PullRequest
0 голосов
/ 26 февраля 2019

Я скопировал файл в образ докера с помощью:

COPY dbconfig.xml /var/app/dbconfig.xml

После этого я попытался заменить некоторые значения в файле на:

RUN sed -i "s/PASSWD/$dbpasswd/" /var/app/dbconfig.xml

Обратите внимание, что $ dbpasswordявляется переменной ENV.

Когда я проверяю содержимое config.xml, запустив контейнер с этим образом и запустив в нем bash, в dbconfig.xml ничего не изменилось.

Теперь я думаю, что неправильно понимаю некоторые основы образов докеров ..

Я даже тестировал, чтобы создать простой файл:

RUN echo "test" > newfile.txt

, который, кажется, удаляется после вызова ... Я знаю, что каждый RUN оператор создает новый слой , и после оператора он удаляется (?).

Я в замешательстве.Почему что-то вроде установки программного обеспечения с

RUN apt-get install -y some-package

не удаляется, а создание простого файла действительно удаляется?

Итак ... как я могу изменить файлы внутри образов докера в image-наращивание времени?

Dockerfile :

FROM dchevell/jira-software:8.0

COPY dbconfig.xml /var/atlassian/application-data/jira/dbconfig.xml
WORKDIR /var/atlassian/application-data/jira

# set default password to admin
ENV dbpasswd=admin

RUN sed -i "s/PASSWD/$dbpasswd/" dbconfig.xml \
 && cat dbconfig.xml 

RUN echo "test" > newfile.txt

dbconfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<jira-database-config>
  <name>defaultDS</name>
  <delegator-name>default</delegator-name>
  <database-type>postgres72</database-type>
  <schema-name>public</schema-name>
  <jdbc-datasource>
    <url>jdbc:postgresql://docker-postgres:5432/jiradb</url>
    <driver-class>org.postgresql.Driver</driver-class>
    <username>atlasdb</username>
    <password>PASSWD</password>
    <pool-test-while-idle>true</pool-test-while-idle>
  </jdbc-datasource>
</jira-database-config>

Обновление 1

Смущает, что когда я КОПИРУЮ что-то в папке WORKDIR, она сохраняется, но когда я пытаюсь потом изменить ее с помощью SED, эти изменения не сохраняются!Я думаю, что на заднем плане происходит какое-то очень темное волшебство .. Может быть, я пытаюсь связать меня с моим предварительно сконфигурированным dbconfig.xml в docker-compose и посмотреть, поможет ли это ..

Обновление 2

Из документации Docker :

Изменение тома из Dockerfile: если какие-либо шаги сборки изменяют данные внутри тома после его объявления,эти изменения будут отменены.

Я полностью пропустил это!Спасибо Дэвиду за указание на меня :). Поэтому создание и запись файлов работает, как и ожидалось, но будьте осторожны с каталогами VOLUME.RUN заявления не работают здесь.Поэтому для решения этой проблемы лучше всего подключить файл к этому тому.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

См. Этот вопрос .

Команды, которые вы выполняете, верны, и они должны создать файлы.Я подозреваю, что при запуске вашего контейнера приложение jira перезаписывает указанный вами WORKDIR.

Попробуйте этот Dockerfile:

WORKDIR /var/atlassian/application-data/jira

# set default password to admin
ENV dbpasswd=admin

RUN sed -i "s/PASSWD/$dbpasswd/" dbconfig.xml \
 && cat dbconfig.xml 


WORKDIR /testtest
RUN touch test.txt
RUN echo "test" > newfile.txt

WORKDIR  /var/atlassian/application-data/jira

Теперь, если вы запустите контейнер,вы можете видеть, что файлы создаются в папке / testtest.

Если вы хотите, чтобы ваши изменения в файле dbconfig.xml сохранялись, вам следует попробовать использовать тома, чтобы связать локальный файл dbconfig.xml с папкой jira..

Спасибо за этот интересный вопрос:)

0 голосов
/ 26 февраля 2019

Если вы посмотрите на Dockerfile для этого базового образа , в нем будет написано:

ENV JIRA_HOME /var/atlassian/application-data/jira
VOLUME ["${JIRA_HOME}"]

Как только вы выполните инструкцию VOLUME в Dockerfile, более поздние операторы Dockerfile могутне вносить никаких изменений в этот конкретный каталог .

Учитывая то, что вы пытаетесь изменить, это очень специфические параметры установки (пароль администратора, настройки базы данных), я бы не стал пытатьсяпостроить образ из них.Вместо этого я бы использовал опцию docker run -v для добавления файла конфигурации во время выполнения.

0 голосов
/ 26 февраля 2019

Каждый оператор RUN не создает промежуточный контейнер, но создает новый слой в файловой системе объединения, который доступен только для чтения.Когда вы запускаете изображение, для этого контейнера создается специальный записываемый слой, и все изменения, которые вы вносите в этот контейнер, записываются в этот слой.(кроме томов. это другая концепция).Вот почему Docker может безопасно передавать одно и то же изображение (или даже слои) между контейнерами, не влияя друг на друга.Вы можете проверить докерскую документацию для получения дополнительной информации.

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

...