Как заменить текст в файле conf в образе докера - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь создать образ Docker, в котором мне нужно получить список каталогов, разделенных запятой в родительском каталоге, и установить его в файле конфигурации, скопированном в контейнер, но текст никогда не заменяется в файле conf.ниже изображение докера.или Github Link

FROM ubuntu:16.04
LABEL maintainer="TEST"

RUN apt-get update && apt-get install vim git -y

COPY odoo.conf /etc/odoo/odoo.cfg

RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world1
RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world2
RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world3
RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world4

COPY setup.sh /setup.sh
RUN ["chmod", "+x", "/setup.sh"]
CMD ["/setup.sh"]

поиск и замена происходят в setup.sh , но ввод в shell никогда не показывает замену.однако, если я выполню команду /setup.sh в оболочке контейнера, она выполнит свою работу.

Хотите знать, как это сделать и что я делаю неправильно?

setup.sh

# get addons path
addons_path=`ls -d /mnt/extra-addons/* | paste -d, -s`
# can't use / because directory name contains, using #
sed -i -e "s#__addons__path__#${addons_path}#" /etc/odoo/odoo.cfg

/ etc/odoo/odoo.conf

[options]
addons_path = __addons__path__
data_dir = /var/lib/odoo
.......

Ожидается / etc / odoo / odoo.conf

[options]
addons_path = /mnt/extra-addons/hellow-world1,/mnt/extra-addons/hellow-world2,/mnt/extra-addons/hellow-world3,/mnt/extra-addons/hellow-world4
data_dir = /var/lib/odoo

## Обновление Я удалил промежуточный файл setup.sh и все делал в Dockerfile, который выглядит как

FROM ubuntu:16.04
LABEL maintainer="TEST"

RUN apt-get update && apt-get install vim git -y

COPY odoo.conf /etc/odoo/odoo.cfg

RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world1
RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world2
RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world3
RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world4
ENV addons_path=$(ls -d /mnt/extra-addons/* | paste -d, -s)  ## Fails here it sets blank so sed command works but the variable addons_path doesn't have the value probably I am defining variable wrongly?
RUN sed -i -e "s#__addons__path__#$addons_path#" /etc/odoo/odoo.cfg

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Я думаю, что хитрость заключалась в том, чтобы выполнить файл .sh

Не работает

CMD ["/setup.sh"]

Работает

RUN /bin/bash -c "/setup.sh"

Окончательный результат

FROM ubuntu:16.04
LABEL maintainer="TEST"

RUN apt-get update && apt-get install vim git -y

COPY odoo.conf /etc/odoo/odoo.cfg

RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world1
RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world2
RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world3
RUN git clone https://github.com/kelseyhightower/helloworld.git /mnt/extra-addons/hellow-world4
#ENV addons_path=$(ls -d /mnt/extra-addons/* | paste -d, -s)
#RUN sed -i -e "s#__addons__path__#NEW_PATH#" /etc/odoo/odoo.cfg

COPY setup.sh /setup.sh
RUN ["chmod", "+x", "/setup.sh"]
RUN /bin/bash -c "/setup.sh"
0 голосов
/ 02 октября 2018

Контейнеры - это оболочка для запуска процесса (эта оболочка представляет собой пространства имен и cgroups).Запускаемый процесс определяется линиями ENTRYPOINT и CMD Dockerfile.Вы можете переопределить процесс по умолчанию для образа, который запускается при запуске контейнера, а для значения CMD переопределение включает в себя передачу другой команды после имени образа.

Поэтому, когда ваш Dockerfile заканчивается на:

COPY setup.sh /setup.sh
RUN ["chmod", "+x", "/setup.sh"]
CMD ["/setup.sh"]

Вы определили значение CMD по умолчанию в своем изображении.Но при запуске:

docker build -t docker-test .; docker run -it docker-test bash

Значение ./setup.sh CMD заменяется на bash.Это означает, что setup.sh никогда не запускается.


Вы можете решить эту проблему несколькими способами.

  1. Вы можете запустить setup.sh как часть сборки образа.,Если сценарий не зависит от того, как выполняется контейнер (например, внешние тома, передаваемые переменные среды и т. Д.), То это лучший выбор.

  2. Переместите сценарий наточку входа и завершите ее, выполнив команду.Когда вы определяете и точку входа, и cmd, контейнер будет запускать только один процесс, поэтому поведение docker заключается в передаче cmd в качестве аргументов точке входа.Чтобы запустить cmd, вам нужно сделать это как часть сценария точки входа.


Вариант # 1 выглядит как решение, которое вы сделали, и ответ, который я бы порекомендовал:

COPY setup.sh /setup.sh
RUN ["chmod", "+x", "/setup.sh"]
RUN ["/setup.sh"]
CMD bash

Вы захотите включить оболочку в начало скрипта, чтобы linux знал, как ее запустить:

#!/bin/sh
# The #!/bin/sh above is important, you can also replace that with the path to bash
# get addons path
addons_path=`ls -d /mnt/extra-addons/* | paste -d, -s`
# can't use / because directory name contains, using #
sed -i -e "s#__addons__path__#${addons_path}#" /etc/odoo/odoo.cfg

Опция # 2 полезна, если/ mnt / extra-addons / изменяется каждый раз, когда вы запускаете контейнер.Это выглядит так:

COPY setup.sh /setup.sh
RUN ["chmod", "+x", "/setup.sh"]
ENTRYPOINT ["/setup.sh"]
CMD ["bash"]

С дополнительной строкой, добавленной в скрипт установки:

#!/bin/sh
# get addons path
addons_path=`ls -d /mnt/extra-addons/* | paste -d, -s`
# can't use / because directory name contains, using #
sed -i -e "s#__addons__path__#${addons_path}#" /etc/odoo/odoo.cfg

# this next line runs the passed arguments as pid 1, replacing this script
# this is how you run an entrypoint and fall through to a cmd
exec "$@"
0 голосов
/ 01 октября 2018

Попробуйте:

addons_path=$(find /mnt/extra-addons/ -type d -maxdepth 1 | tr '\n' ',')
sed -i -e "s#__addons__path__#${addons_path}#" /etc/odoo/odoo.cfg
  1. Это не будет работать, если имена файлов содержат # или переводы строк.
  2. paste объединяет два потока в один.У вас есть только один поток.Используйте tr, например, для замены новой строки на другой символ.
  3. Не анализируйте вывод ls.
  4. Синтаксис с использованием `` устарел, используйте $( ... ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...