Docker файл и составить обновление - PullRequest
1 голос
/ 02 августа 2020

Я создал простой технический стек, используя Docker. PHP 7.2 на CentOS.

Ниже docker файл

FROM centos:7

# Install Apache
RUN yum -y update
RUN yum -y install httpd httpd-tools

# Install EPEL Repo
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
 && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# Install PHP
RUN yum -y install php72w php72w-bcmath php72w-cli php72w-common php72w-gd php72w-intl php72w-ldap php72w-mbstring \
    php72w-mysql php72w-pear php72w-soap php72w-xml php72w-xmlrpc

# Update Apache Configuration
RUN sed -E -i -e '/<Directory "\/var\/www\/html">/,/<\/Directory>/s/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf
RUN sed -E -i -e 's/DirectoryIndex (.*)$/DirectoryIndex index.php \1/g' /etc/httpd/conf/httpd.conf

EXPOSE 80

# Start Apache
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

Ниже docker -compose.yml

version: '3.2'
  services:
   centos-php-apache:
     build:
       context: ./
     ports:
      - "8080:80"
     volumes:
      - ./code:/var/www/html

Все теперь работает нормально. Через несколько дней я решил обновить следующее -

(i) Обновить «dockerfile», добавив еще php -module или php -extension

(ii) Обновить docker compose.yml, добавив еще одну службу (скажем) «mariadb».

Я хотел бы выполнить это обновление, не влияя и не удаляя какие-либо файлы из предыдущей настройки. Фактически, это распространенный сценарий, когда разработчикам могут потребоваться дополнительные расширения или услуги в будущем - без переделывания всего с самого начала.

Следует ли мне напрямую редактировать «dockerfile» и добавлять php расширение и отредактируйте файл docker -compose.yml и добавьте службу как обычно, а затем запустите команду docker -compose up. Конечно, прежде чем запускать команду "вверх", я сначала отключу его с помощью команды docker -compose down.

Может ли кто-нибудь пролить свет на то, как sh это сделать.

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Я добавляю фиктивную настройку вместе с содержимым файлов:

tree
.
├── docker-compose.yml
├── mariadb
│   └── Dockerfile
└── web-app
    └── Dockerfile

------------------------

cat docker-compose.yml
version: "3"
services:
  webapp:
    build:
      context: ./web-app
      dockerfile: Dockerfile
  mariadb:
    build:
      context: ./mariadb
      dockerfile: Dockerfile
    environment:
      - MYSQL_ROOT_PASSWORD=supersecret

------------

cat mariadb/Dockerfile 
FROM mariadb
RUN echo "hello from mariadb"

------------

cat web-app/Dockerfile 
FROM nginx
RUN echo "Hello"
RUN echo "from web-app"
# ^^ that's an example for a change that you want to perform(adding a new module) ^^

Предполагая, что вы только что выполнили изменение в веб-приложении / Dockerfile, у вас есть несколько вариантов:

Вариант A:

Вы перестраиваете одно определенное c изображение, при этом текущие контейнеры не затрагиваются:

docker-compose build webapp

Building webapp
Step 1/3 : FROM nginx
 ---> 2622e6cca7eb
Step 2/3 : RUN echo "Hello"
 ---> Using cache
 ---> ad39a2920d75
Step 3/3 : RUN echo "from web-app"
 ---> Running in ea62a9e81110
from web-app
Removing intermediate container ea62a9e81110
 ---> 9fc79785a4c4

Когда вам удобно с созданным вами образом повторно разверните контейнеры, в которых произошли изменения образа (обратите внимание, что если вы запустите docker -compose up, только веб-приложение будет повторно развернуто):

docker-compose up -d  

stack-example_mariadb_1 is up-to-date
Recreating stack-example_webapp_1 ... done

Вариант B :

Если вы уверены в изменениях, которые вы внесли в Dockerfile, go для однострочника с опцией --build:

docker-compose up -d --build 

Building webapp
Step 1/4 : FROM nginx
 ---> 2622e6cca7eb
Step 2/4 : RUN echo "Hello"
 ---> Using cache
 ---> ad39a2920d75
Step 3/4 : RUN echo "from web-appi"
 ---> Running in 8cbd41c34d35
from web-appi
Removing intermediate container 8cbd41c34d35
 ---> ed7bc1950d4c
Step 4/4 : RUN echo "change 2"
 ---> Running in f52be965609f
change 2
Removing intermediate container f52be965609f
 ---> da600ed3f0ed
Successfully built da600ed3f0ed
Successfully tagged stack-example_webapp:latest
Building mariadb
Step 1/2 : FROM mariadb
 ---> 8075b7694a2d
Step 2/2 : RUN echo "hello from mariadb"
 ---> Using cache
 ---> 89f75af407fe
Successfully built 89f75af407fe
Successfully tagged stack-example_mariadb:latest
Recreating stack-example_webapp_1 ... 
Recreating stack-example_webapp_1 ... done
1 голос
/ 02 августа 2020

Было бы лучше, если бы вы использовали docker-compose up --build centos-php-apache вместо docker-compose up . И вы не хотите беспокоиться о данных. Они постоянны с вашей картой объемов. Кроме того, не забудьте использовать другую карту объемов для ваших данных mariadb.

...