2
votes

Exécution de docker-compose dans un autre conteneur Dockerized

Je configure mon environnement de développement et cette fois-ci j'utilise un conteneur docker pour tout exécuter ... comme tmux, vim, etc.

Quand j'exécute l'image qui exécute mon éditeur, j'utilise -v /var/run/docker.sock:/var/run/docker.sock et de cette façon lorsque j'utilise la commande docker dans le shell du conteneur de l'éditeur auquel il est lié docker sur l'ordinateur hôte et je peux exécuter des conteneurs Docker supplémentaires sans problème. De cette façon, je peux coder dans mon conteneur d'éditeur et créer d'autres conteneurs en tant qu'env env.

Cependant, si j'essaie d'exécuter le même Dockerfile à partir du conteneur de l'éditeur qui fonctionnait en utilisant docker build et docker run en utilisant un docker-compose.yml et docker-compose up J'obtiens le résultat suivant:

OUTPUT

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"]

Si je effectuer les mêmes étapes sur la machine hôte en utilisant le même répertoire, j'obtiens la sortie normale suivante:

ATTENDU

FROM node:alpine

WORKDIR '/app'

COPY package.json .

RUN npm install

COPY ./ ./


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

Dockerfile.dev

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

docker-compose.yml

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


0 commentaires

3 Réponses :


0
votes

Les volumes Docker Compose: font toujours référence aux chemins sur l'hôte. (Idem pour docker run -v .) Si vous lancez Docker sous une forme ou une autre à partir d'un conteneur, il n'y a aucun moyen d'injecter le système de fichiers local d'un conteneur dans un autre.

Pour l'application que vous décrivez, je suggère deux chemins:

  1. Si votre objectif est d'exécuter l'application en mode développement, avec des débogueurs et un rechargement en direct, rangez complètement Docker et utilisez simplement npm / yarn localement. (Je parie que vous avez de toute façon installé vim et tmux sur votre hôte pour l'administration de base de cet outil que vous utilisez, et installer Node est strictement plus facile que d'installer Docker.)

  2. Si votre objectif est d'exécuter l'application dans Docker pour des tests de production ou de pré-production, supprimez les directives volumes: du Dockerfile. Après avoir construit et testé votre application à partir de l'étape 1, docker build une image et exécutez l'image elle-même, sans tenter de remplacer son code.

N'oubliez pas également que toute personne ou tout ce qui peut exécuter des commandes Docker a un accès root illimité sur l'hôte. Je ne vois aucun avantage évident à exécuter Docker Compose dans un conteneur comme vous le décrivez.


0 commentaires

0
votes

J'ai compris ce qui se passait. Lorsque je lance le conteneur de l'éditeur, je monte un volume où tous mes projets sont stockés (c'est-à-dire -v chemin / vers / hôte / projets: / chemin / vers / conteneur / projets).

Lorsque docker-compose est conforme au fichier .yml (en particulier lorsqu'il transforme les chemins abrégés comme. en chemins complets), il le fait sur le conteneur de l'éditeur, mais lorsqu'il envoie les commandes à docker, il l'envoie à docker sur le hôte en raison de -v /var/run/docker.sock:/var/run/docker.sock . Ainsi, docker essaie de monter le volume en utilisant le chemin de travail du conteneur sur l'hôte, que docker ne peut évidemment pas trouver. Mon travail actuel (merdique) consiste à monter le volume sur le même nom de chemin (c'est-à-dire -v / chemin / vers / projets: / chemin / vers / projets). Ce n'est pas propre mais ça marche :)

Ouvert à toutes les idées pour une meilleure solution!


0 commentaires

0
votes

J'obtenais également cela en utilisant docker-compose. Je l'ai résolu en changeant.: / App en.: / Src / app sous les volumes dans docker-compose.yml


0 commentaires