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
3 Réponses :
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:
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.)
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.
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!
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