Почему мой образ докера не может запустить приложение, когда я запускаю его после импорта - PullRequest
1 голос
/ 26 марта 2019

Ниже мой докер-файл

FROM node:10.15.0
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY ./build/release /usr/src/app/
RUN yarn
EXPOSE 3000
CMD [ "node", "server.js" ]

Сначала я запустил

docker build -t app .

, а затем

docker run -t -p 3000:3000 app

Все отлично работает через localhost: 3000 на моем компьютере.

Затем я пытаюсь экспортировать это изображение с помощью

 docker export 68719e2bb0cd > app.tar

и импортировать снова с помощью

cat app.tar | docker import - app2

, затем запустить docker run -t -d -p 2000: 3000 app2

и вышла ошибка

docker: Error response from daemon: No command specified.

Почему это произошло?

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Вы используете неправильные команды: docker export и docker import передают только часть файловой системы изображения, а не другие данные, такие как переменные среды или команду по умолчанию. Для этих команд нет типичного варианта использования.

Стандартный способ сделать это - настроить реестр Docker или использовать общедоступный сервер реестра, такой как Docker Hub, AWS ECR, GCR, ... После того, как вы это настроите, вы можете docker push образ в реестр из системы, в которой он был создан, а затем docker pull в той системе, в которой вы хотите его запустить (или непосредственно docker run, что автоматически вытянет изображение, если оно отсутствует).

Если вы действительно не можете настроить реестр, тогда вам действительно нужны команды docker save и docker load, которые сохраняют полные изображения со всеми их метаданными. Я хотел этого только в тех средах, где я не могу подключить системы, которые я хочу запустить, к серверу реестра; в противном случае реестр почти всегда лучше. (Кластерные среды, такие как Docker Swarm и Kubernetes, почти также нуждаются в реестре.)

0 голосов
/ 26 марта 2019

Просто передайте команду на запуск. потому что импортированное изображение потеряет все связанные с ним метаданные при экспорте, поэтому команда по умолчанию не будет доступна после импорта в другое место.

Правильная команда будет выглядеть примерно так: docker run -t -d -p 2000: 3000 app2 /path/to/something.sh

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