Как создать и запустить контейнер Docker на основе минимального изображения? - PullRequest
0 голосов
/ 01 февраля 2020

Я хотел бы построить контейнер на основе изображения, определенного в Dockerfile, следующим образом:

FROM alpine:3.7
RUN touch test.txt
RUN echo "Hello Worl" > ./test.txt

После выдачи docker image build -t test_alp . я могу найти изображение в списке доступных изображений:

me@ub:test_dockerfile$ docker image build -t test_alp .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM alpine:3.7
 ---> 6d1ef012b567
Step 2/3 : RUN touch test.txt
 ---> Running in 70a9056b0421
Removing intermediate container 70a9056b0421
 ---> 87b4ee2e9839
Step 3/3 : RUN echo "Hello Worl" > ./test.txt
 ---> Running in b48af2120d80
Removing intermediate container b48af2120d80
 ---> 7326560e8a47
Successfully built 7326560e8a47
Successfully tagged test_alp:latest

me@ub:test_dockerfile$ docker image list
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
test_alp              latest              7326560e8a47        46 seconds ago      4.21MB

Затем я создаю контейнер и запускаю его.

me@ub:test_dockerfile$ docker create --name cont_alp 7326560e8a47
0f857d36e5b594afab7133513faf1dc3c62269a50af0e28e15564852fc379b10

(Между вопросами: могу ли я также создать контейнер, используя docker create test_alp?)

me@ub:test_dockerfile$ docker container ls -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
0f857d36e5b5        7326560e8a47          "/bin/sh"                11 seconds ago      Created                                      cont_alp
me@ub:test_dockerfile$ docker start cont_alp
cont_alp
me@ub:test_dockerfile$ docker container ls -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                     PORTS                    NAMES
0f857d36e5b5        7326560e8a47          "/bin/sh"                24 seconds ago      Exited (0) 4 seconds ago                            cont_alp

Как видите, контейнер сразу возвращается в состояние Exited. Почему это?

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Потому что ваша команда RUN вышла после выполнения! Как правило, контейнеры docker запускают команды длинного демона выполнения, такие как серверные приложения ...

Вы можете сделать это, поместив команды, которые вы хотите выполнить, в сценарий с помощью al oop и установив для сценария значение команда Docker запускается при запуске контейнера:

CMD /script.sh
1 голос
/ 01 февраля 2020

alpine:3.7 (как и все другие версии ...) запускает sh в качестве команды по умолчанию .

Вы не меняете команду контейнера по умолчанию в вашей сборке. Когда вы запустите ваш контейнер, он запустит эту команду. Поскольку tty не привязан к s sh и вы не запрашивали интерактивный прогон, sh не имеет ничего для обработки и существует.

2 способа попасть в ваш контейнер для тестов:

  1. запустить контейнер с нуля в интерактивном режиме:
docker run -it --rm --name cont_alp test_alp:latest
запустите контейнер в фоновом режиме с помощью длительной команды и выполните sh, чтобы подключиться к нему:
docker run -d --rm --name cont_alp test_alp:latest sh -c "while true; do sleep 2000; done"
docker exec -it cont_alp sh

Если вы хотите по умолчанию запускать свои контейнеры на основе приведенного выше изображения с помощью длительной команды вы можете добавить ее в свой Dockerfile. (Обратите внимание, что я также уменьшил количество необходимых слоев, запустив touch и echo за один проход. Но нужно ли вам в любом случае касаться ...)

FROM alpine:3.7
RUN touch test.txt && echo "Hello World" > test.txt
CMD ["/bin/sh", "-c", "while true; do sleep 2000; done"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...