Создание файла в сборке Docker

#linux #bash #docker #shell #dockerfile

#linux #bash #docker #оболочка #dockerfile

Вопрос:

Я создаю образ, который устанавливает зависимости, клонирует репозиторий git, настраивает среду python, обновляет файлы конфигурации и создает службу systemctl. Все работает, кроме скрипта (start.sh ) Я стараюсь творить в конце процесса. Кажется, он присутствует на этапе сборки docker, но как только я запускаю изображение, он исчезает.

 # Dockerfile 
RUN echo "#!/bin/bash" > start.sh
RUN echo "systemctl start jenkins" >> start.sh
RUN echo "systemctl start runserver" >> start.sh
RUN cat start.sh
RUN chmod  x start.sh
  

Мой вывод терминала сборки Docker

 Step 28/32 : RUN echo "#!/bin/bash" > start.sh
 ---> Running in 4a3f91a67b90
Removing intermediate container 4a3f91a67b90
 ---> 7fc47c36f4b8
Step 29/32 : RUN echo "systemctl start jenkins" >> start.sh
 ---> Running in 6807840fab7e
Removing intermediate container 6807840fab7e
 ---> d945ba395f9d
Step 30/32 : RUN echo "systemctl start runserver" >> start.sh
 ---> Running in 205c38c6e9e3
Removing intermediate container 205c38c6e9e3
 ---> 5684fd6346b9
Step 31/32 : RUN cat start.sh
 ---> Running in ce3326beb99c
#!/bin/bash
systemctl start jenkins
systemctl start runserver
Removing intermediate container ce3326beb99c
 ---> efd96d67c6c3
Step 32/32 : RUN chmod  x start.sh
 ---> Running in fffd5de0f924
  

Я попытался установить абсолютный путь для определения целевого файла:

 # Dockerfile 
RUN echo "#!/bin/bash" > /home/ubuntu/start.sh
...
  

Но это не удалось.

Что здесь может быть не так?

Обновить

Для запуска образа:

 docker run -tid 
            --name auto-server 
            --rm 
            --volume data:/home/ubuntu 
            --publish 8080:8080 
            --publish 8000:8000 
            --publish 50000:50000 
            --cap-add=NET_ADMIN 
            --cap-add=NET_RAW 
            auto-server:1.0
  

Чтобы увидеть, что оболочка исчезает:

 # container build
$ docker build -t auto-server:1.0 .
... 
Step 27/31 : RUN echo "#!/bin/bash" > /home/ubuntu/start.sh
 ---> Running in 2a022fcec2f4
Removing intermediate container 2a022fcec2f4
 ---> c9d1ff27d96f
Step 28/31 : RUN echo "systemctl start jenkins" >> /home/ubuntu/start.sh
 ---> Running in 3ed993cd03c7
Removing intermediate container 3ed993cd03c7
 ---> 0e8c4463c472
Step 29/31 : RUN echo "systemctl start runserver" >> /home/ubuntu/start.sh
 ---> Running in aa31dbce3716
Removing intermediate container aa31dbce3716
 ---> d48a1fd0580c
Step 30/31 : RUN cat /home/ubuntu/start.sh
 ---> Running in 23785ebdb620
#!/bin/bash                      <== File is present during build
systemctl start jenkins
systemctl start runserver
Removing intermediate container 23785ebdb620
 ---> 7499157cede3
Step 31/31 : RUN chmod  x /home/ubuntu/start.sh
 ---> Running in 43980bffe8cc
Removing intermediate container 43980bffe8cc
 ---> 2932ca0c3d29
Successfully built 2932ca0c3d29
Successfully tagged auto-server:1.0

$ docker run -tid 
            --name auto-server 
            --rm 
            --volume data:/home/ubuntu 
            --publish 8080:8080 
            --publish 8000:8000 
            --publish 50000:50000 
            --cap-add=NET_ADMIN 
            --cap-add=NET_RAW 
            auto-server:1.0

$ docker exec -ti auto-server bash
root@a36c99271b8a:/home/ubuntu#
root@a36c99271b8a:/home/ubuntu# ls -la
total 1856
drwxr-xr-x. 3 root root    4096 Oct  5 08:36 .
drwxr-xr-x. 1 root root    4096 Oct  6 05:56 ..
drwxr-xr-x. 8 root root    4096 Oct  5 09:21 auto
-rw-r--r--. 1 root root 1885433 Oct  5 08:20 get-pip.py
  

Когда я использую CMD ["bash", "-c", "systemctl start jenkins"] в своем Dockerfile, служба Jenkins запускается при запуске образа.

Комментарии:

1. Как вы запускаете образ? (Вы скрываете содержимое изображения с помощью тома?) В первом приближении systemctl и аналогичные команды просто не работают в Docker, и обычно лучше разделить это на два отдельных контейнера, чем пытаться запустить две отдельные службы в одном контейнере.

2. but once I run the image, it disappears. Пожалуйста, покажите, как вы запускаете образ и как вы узнаете, что он исчезает?

3. Скрипт должен быть в самом изображении. вы это проверили? Также при сборке образа используются команды запуска, для запуска процесса контейнера мы должны использовать CMD или ENTRYPOINT.

4. Когда вы запускаете скрипт, вы не перенаправляетесь на файл в изображении. И настройки, которые вы устанавливаете, отсутствуют в файле на изображении. Не лучше ли было бы использовать команду КОПИРОВАТЬ cmd? Вам также необходимо установить точку входа.

5. --volume data:/home/ubuntu …. Таким образом, вы заменяете /home/ ubuntu некоторым data томом, поэтому все внутри будет потеряно. Если вы хотите создать какой-либо файл внутри data тома, создайте его там.

Ответ №1:

В вашей команде run вы монтируете локальный каталог в /home/ubuntu

 --volume data:/home/ubuntu 
  

Это означает, что все, что внутри /home/ubuntu , будет заменено содержимым локального data каталога
Вы можете написать сценарий для другого пути, например /opt/scripts/start.sh
Или вы можете создать скрипт вне Dockerfile своего data каталога.