Вопрос:

Запуск docker-compose в другом Dockerized Container

docker npm docker-compose dockerfile

60 просмотра

3 ответа

14 Репутация автора

Я настраиваю свою среду разработки, и на этот раз я использую Docker-контейнер для запуска всего, например, tmux, vim и т. Д.

Когда я запускаю образ, который запускает мой редактор, я использую его -v /var/run/docker.sock:/var/run/docker.sockи, таким образом, когда я использую dockerкоманду в оболочке контейнера редактора, он связывается с докером на главном компьютере, и я могу без проблем запускать дополнительные контейнеры докера. Таким образом, я могу кодировать в своем контейнере редактора и раскручивать другие контейнеры как dev envs.

Однако, если я пытаюсь запустить тот же Dockerfile из контейнера редактора, который работал с использованием docker buildи docker runиспользованием docker-compose.yml, и docker-compose upя получаю следующий вывод:

ВЫХОД

Recreating frontend_tests_1 ... done
Recreating frontend_web_1   ... done
Attaching to frontend_tests_1, frontend_web_1
tests_1  | npm ERR! path /app/package.json
tests_1  | npm ERR! code ENOENT
tests_1  | npm ERR! errno -2
tests_1  | npm ERR! syscall open
web_1    | npm ERR! path /app/package.json
web_1    | npm ERR! code ENOENT
web_1    | npm ERR! errno -2
web_1    | npm ERR! syscall open
tests_1  | npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
tests_1  | npm ERR! enoent This is related to npm not being able to find a file.
tests_1  | npm ERR! enoent 
web_1    | npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
web_1    | npm ERR! enoent This is related to npm not being able to find a file.
web_1    | npm ERR! enoent 
tests_1  | 
tests_1  | npm ERR! A complete log of this run can be found in:
tests_1  | npm ERR!     /root/.npm/_logs/2019-03-24T22_08_49_446Z-debug.log
web_1    | 
web_1    | npm ERR! A complete log of this run can be found in:
web_1    | npm ERR!     /root/.npm/_logs/2019-03-24T22_08_49_447Z-debug.log
frontend_web_1 exited with code 254
frontend_tests_1 exited with code 254

Если я выполняю те же шаги на хост-компьютере, используя тот же каталог, я получаю следующий нормальный вывод:

ОЖИДАЕТСЯ

Recreating frontend_web_1   ... done
Recreating frontend_tests_1 ... done
Attaching to frontend_web_1, frontend_tests_1
web_1    | 
web_1    | > frontend@0.1.0 start /app
web_1    | > react-scripts start
web_1    | 
tests_1  | 
tests_1  | > frontend@0.1.0 test /app
tests_1  | > react-scripts test --env=jsdom
tests_1  | 
web_1    | Starting the development server...
web_1    | 
tests_1  |  PASS  src/App.test.js
tests_1  |   ✓ renders without crashing (22ms)
tests_1  | 
tests_1  | Test Suites: 1 passed, 1 total
tests_1  | Tests:       1 passed, 1 total
tests_1  | Snapshots:   0 total
tests_1  | Time:        1.352s
tests_1  | Ran all test suites related to changed files.
tests_1  | 
tests_1  | Watch Usage
tests_1  |  › Press p to filter by a filename regex pattern.
tests_1  |  › Press t to filter by a test name regex pattern.
tests_1  |  › Press q to quit watch mode.
tests_1  |  › Press Enter to trigger a test run.
web_1    | Compiled successfully!
web_1    | 
web_1    | You can now view frontend in the browser.
web_1    | 
web_1    |   Local:            http://localhost:3000/
web_1    |   On Your Network:  http://0.0.0.0:3000/
web_1    | 
web_1    | Note that the development build is not optimized.
web_1    | To create a production build, use yarn build.
web_1    | 
^CGracefully stopping... (press Ctrl+C again to force)
Stopping frontend_tests_1   ... done
Stopping frontend_web_1     ... done

Dockerfile.dev

FROM node:alpine

WORKDIR '/app'

COPY package.json .

RUN npm install

COPY ./ ./


CMD ["npm", "run", "start"]

докер-compose.yml

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "8080:8080"
    volumes:
      - /app/node_modules
      - .:/app
  tests:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - /app/node_modules
      - .:/app
    command: ["npm", "run", "test"]

Автор: gabeleibo Источник Размещён: 24.03.2019 10:43

Ответы (3)


0 плюса

22639 Репутация автора

volumes:Директивы Docker Compose всегда ссылаются на пути на хосте. (То же самое для docker run -v.) Если вы запускаете Docker в какой-либо форме из контейнера, нет способа внедрить локальную файловую систему одного контейнера в другой.

Для приложения, которое вы описываете, я бы предложил два пути:

  1. Если ваша цель - запустить приложение в режиме разработки с отладчиками и перезагрузкой в ​​реальном времени, полностью уберите Docker и просто используйте npm / yarn локально. (Держу пари, у вас на хосте в любом случае установлены vim и tmux для базового администрирования того инструмента, который вы используете, и установка Node строго проще, чем установка Docker.)

  2. Если ваша цель - запустить приложение в Docker для производственного или предсерийного тестирования, удалите volumes:директивы из Dockerfile. После docker buildсоздания и тестирования вашего приложения с шага 1 создайте образ и запустите само изображение, не пытаясь заменить его код.

Также помните, что любой или все, что может запускать команды Docker, имеет неограниченный root-доступ через хост. Я не вижу очевидного преимущества запуска Docker Compose в контейнере, как вы описываете.

Автор: David Maze Размещён: 25.03.2019 11:43

0 плюса

14 Репутация автора

Я понял, что случилось. Когда я запускаю контейнер редактора, я монтирую том, где хранятся все мои проекты (т.е. -v путь / к / хосту / проекты: / путь / к / контейнеру / проекты).

Когда docker-compose соответствует файлу .yml (в частности, когда он превращает сокращенные пути, такие как. В полные пути), он делает это в контейнере редактора, но затем, когда он отправляет команды в Docker, он отправляет его в Docker на хосте из-за -v /var/run/docker.sock:/var/run/docker.sock, Таким образом, Docker пытается смонтировать том, используя рабочий путь контейнера на хосте, который Docker, очевидно, не может найти. Моя текущая (дрянная) работа - смонтировать том с тем же именем пути (то есть -v / path / to / projects: / path / to / projects). Это не чисто, но это работает :)

Открыты для любых идей для лучшего решения!

Автор: gabeleibo Размещён: 25.03.2019 09:34

0 плюса

1 Репутация автора

Я получал это при использовании docker-compose. Я решил это, изменив.: / App на.: / Src / app под томами внутри docker-compose.yml

Автор: xv6 Размещён: 11.08.2019 08:22
Вопросы из категории :
32x32