Docker bind-mount не работает должным образом в AWS EC2 Instance - PullRequest
2 голосов
/ 29 января 2020

Я создал следующее Dockerfile для запуска приложения с весенней загрузкой: myapp в экземпляре EC2.

# Use an official java runtime as a parent image
FROM openjdk:8-jre-alpine


# Add a user to run our application so that it doesn't need to run as root
RUN adduser -D -s /bin/sh myapp


# Set the current working directory to /home/myapp
WORKDIR /home/myapp

#copy the app to be deployed in the container
ADD target/myapp.jar myapp.jar

#create a file entrypoint-dos.sh and put the project entrypoint.sh content in it
ADD entrypoint.sh entrypoint-dos.sh

#Get rid of windows characters and put the result in a new entrypoint.sh in the container
RUN sed -e 's/\r$//' entrypoint-dos.sh > entrypoint.sh

#set the file as an executable and set myapp as the owner
RUN chmod 755 entrypoint.sh && chown myapp:myapp entrypoint.sh

#set the user to use when running the image to myapp
USER myapp

# Make port 9010 available to the world outside this container
EXPOSE 9010


ENTRYPOINT ["./entrypoint.sh"]

Поскольку мне нужен доступ к журналам myapp из EC2 хост-машина, я хочу подключить папку к папке журналов, которая находится в контейнере «myapp», здесь: /home/myapp/logs

Это команда, которую я использую для запуска образа в консоли ec2:

docker run -p 8090:9010 --name myapp myapp:latest -v home/ec2-user/myapp:/home/myapp/logs

Контейнер запускается без каких-либо проблем, но монтирование не достигается, как отмечено в следующем docker inspect извлечении:

...      
"Mounts": [],
...

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

  • --mount type=bind вместо -v

  • использовать тома вместо bind-mount

  • Я даже попробовал --privileged вариант

  • В Dockerfile: я пытался использовать USER root вместо myapp

Полагаю, это не имеет ничего общего с машиной ec2, кроме моего контейнера. Поскольку запуск других контейнеров с bind-mounts на том же хосте работает как чудо.

Я почти уверен, что испортил свой Dockerfile.

Но что я делаю не так в этом Dockerfile?

или

Что я пропускаю?

Здесь у вас есть entrypoint.sh при необходимости :

   #!/bin/sh
   echo "The app is starting ..."
   exec java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom  -jar -Dspring.profiles.active=${SPRING_ACTIVE_PROFILES} "${HOME}/myapp.jar" "$@"

1 Ответ

1 голос
/ 29 января 2020

Я думаю, что проблема может быть в порядке опций в командной строке. Docker ожидает, что последние два аргумента будут идентификатором / именем изображения и (необязательно) командой / аргументами для запуска в качестве pid 1.

https://docs.docker.com/engine/reference/run/

Команда запуска basi c docker имеет следующий вид: $ docker run [ОПЦИИ] ИЗОБРАЖЕНИЕ [: TAG | @DIGEST] [КОМАНДА] [ARG ...]

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

Также, источник монтирования здесь (home / ec2-user / myapp) не начинается с ведущего вперед sla sh (/), который, я полагаю, сделает его относительно того места, где выполняется команда docker run , Вы должны убедиться, что исходный путь начинается с forward sla sh (то есть / home / ec2-user / myapp), чтобы вы всегда были уверены в том, что каталог, который вы ожидаете, всегда монтируется. Т.е. -v /home/ec2-user...

Вы пробовали этот заказ:

docker run -p 8090:9010 --name myapp -v /home/ec2-user/myapp:/home/myapp/logs myapp:latest

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...