Ответ 1
Оформить их документацию
Судя по всему, вы можете сделать следующее на вашем docker-compose.yml
volumes:
- ./:/app
У меня есть среда разработки, которую я докционирую, и мне хотелось бы, чтобы она могла обновлять мои изменения без необходимости перестраивать изображения докеров. Я использую docker compose, потому что redis - одна из моих зависимостей между приложениями, и мне нравится связывать контейнер redis
У меня есть два контейнера, определенные в моем docker-compose.yml
:
node:
build: ./node
links:
- redis
ports:
- "8080"
env_file:
- node-app.env
redis:
image: redis
ports:
- "6379"
Я дошел до того, что нашел в своем node
app dockerfile, где я добавляю том, но как смонтировать каталог хоста в томе, чтобы все мои живые изменения в коде отражались в контейнере?
Здесь мой текущий файл Docker:
# 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"]
Мой проект выглядит следующим образом:
/
- docker-compose.yml
- node-app.env
- node/
- app.js
- Dockerfile.js
Оформить их документацию
Судя по всему, вы можете сделать следующее на вашем docker-compose.yml
volumes:
- ./:/app
Есть несколько вариантов
Используя формат host : guest
, вы можете выполнить любое из следующих действий:
volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql
# Specify an absolute path mapping
- /opt/data:/var/lib/mysql
# Path on the host, relative to the Compose file
- ./cache:/tmp/cache
# User-relative path
- ~/configs:/etc/configs/:ro
# Named volume
- datavolume:/var/lib/mysql
Начиная с docker-compose v3.2 вы можете использовать длинный синтаксис, который позволяет настраивать дополнительные поля, которые могут быть выражены в краткой форме, такой как mount type
(volume, bind или tmpfs) и read_only
.
version: "3.2"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
networks:
webnet:
volumes:
mydata:
Проверьте https://docs.docker.com/compose/compose-file/#long-syntax-3 для получения дополнительной информации.
Это было две вещи:
Я добавил том в docker-compose.yml
:
node:
volumes:
- ./node:/app
Я переместил фрагменты npm install && nodemon app.js
в CMD
, потому что RUN
добавляет вещи в файловую систему Союза, а мой том не является частью UFS.
# 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"]
# Define working directory
WORKDIR /app
# Expose port
EXPOSE 8080
# Run npm install
CMD npm install && nodemon app.js
Если вы хотите смонтировать определенный каталог хоста (/disk1/prometheus-data
в следующем примере) как том в разделе volumes
файла YAML Docker Compose, вы можете сделать это, как показано ниже, например:
version: '3'
services:
prometheus:
image: prom/prometheus
volumes:
- prometheus-data:/prometheus
volumes:
prometheus-data:
driver: local
driver_opts:
o: bind
type: none
device: /disk1/prometheus-data
Кстати, в Prometheus Dockerfile вы можете найти инструкцию VOLUME
, как показано ниже, которая помечает ее как содержащую внешние тома из собственного хоста и т.д. (Обратите внимание: эта инструкция не является хотя необходимо смонтировать том в контейнер.):
Dockerfile
...
VOLUME ["/prometheus"]
...
Refs: