Mam środowisko programistyczne, które dokeryzuję, i chciałbym mieć możliwość ponownego ładowania zmian na żywo bez konieczności przebudowywania obrazów dockera. Używam Docker Compose, ponieważ redis jest jedną z zależności mojej aplikacji i lubię łączyć kontener Redis
Mam zdefiniowane dwa kontenery w moim docker-compose.yml
:
node:
build: ./node
links:
- redis
ports:
- "8080"
env_file:
- node-app.env
redis:
image: redis
ports:
- "6379"
node
Dotarłem do punktu w pliku dokowanym mojej aplikacji, w którym dodaję wolumin, ale jak mogę zamontować katalog hosta w woluminie, aby wszystkie moje edycje kodu na żywo były odzwierciedlone w kontenerze?
Oto mój obecny plik Dockerfile:
# Set the base image to Ubuntu
FROM node:boron
# File Author / Maintainer
MAINTAINER Amin Shah Gilani <[email protected]>
# Install nodemon
RUN npm install -g nodemon
# Add a /app volume
VOLUME ["/app"]
# TODO: link the current . to /app
# Define working directory
WORKDIR /app
# Run npm install
RUN npm install
# Expose port
EXPOSE 8080
# Run app using nodemon
CMD ["nodemon", "/app/app.js"]
Mój projekt wygląda tak:
/
- docker-compose.yml
- node-app.env
- node/
- app.js
- Dockerfile.js
docker
docker-compose
docker-volume
Amin Shah Gilani
źródło
źródło
Error: Cannot find module '/data/app.js'
/app/
dlaczego wskazuje Twój CMD/data
Error: Cannot find module 'express'
, spróbuję teraz kilku rzeczy.- .:c:/app
(to mnieJest kilka opcji
Krótka składnia
Korzystając z
host : guest
formatu, możesz wykonać jedną z następujących czynności:Długa składnia
Od docker-compose v3.2 możesz używać długiej składni, która pozwala na konfigurację dodatkowych pól, które mogą być wyrażone w krótkiej formie, takich jak
mount type
(volume, bind lub tmpfs) iread_only
.Sprawdzić https://docs.docker.com/compose/compose-file/#long-syntax-3, aby uzyskać więcej informacji.
źródło
Jeśli chciałbyś zamontować określony katalog hosta (
/disk1/prometheus-data
w poniższym przykładzie) jako wolumin wvolumes
sekcji pliku YAML Docker Compose, możesz to zrobić jak poniżej, np:Nawiasem mówiąc, w pliku Dockerfile Prometeusza możesz znaleźć plik
VOLUME
instrukcję jak poniżej, która oznacza, że zawiera ona woluminy zamontowane zewnętrznie z hosta natywnego itp. (Uwaga: ta instrukcja nie jest jednak koniecznością, aby zamontować wolumin w kontenerze). :Dockerfile
Odniesienia:
źródło
local
typu sterownika?local
driver_opts: o: bind type: none
?local
sterownik w Linuksie akceptuje opcje podobne do polecenia mount linux: man7.org/linux/man-pages/man8/mount.8.html . Więcej dyskusji znajdziesz na github.com/moby/moby/issues/19990#issuecomment-248955005 i stackoverflow.com/questions/35841241/ ...To były dwie rzeczy:
Dodałem wolumin w
docker-compose.yml
:Przeniosłem
npm install && nodemon app.js
fragmenty do a,CMD
ponieważRUN
dodaje rzeczy do systemu plików Union, a mój wolumin nie jest częścią UFS.źródło
musimy stworzyć własny wolumin docker zmapowany z katalogiem hosta, zanim wspomnimy w docker-compose.yml jako zewnętrzny
1. Utwórz udział o nazwie woluminu
2. użyj go w swoim docker-compose
W ten sposób możemy współdzielić ten sam katalog z wieloma usługami działającymi w różnych kontenerach
źródło