#docker #visual-studio-code #docker-compose #vscode-devcontainer
#docker #visual-studio-code #docker-compose #vscode-devcontainer
Вопрос:
Сценарий
Проект, над которым я работаю (приложение React), используется docker-compose
для настройки его серверной части, веб-сервера и интерфейса. Я работаю внутри VSCode devcontainer
(узел с Typescript).
Настроенный мной Docker в среде Docker, похоже, работает нормально, и я могу запускать каждый из контейнеров Docker, но мне пришлось адаптировать код следующим образом, потому что в противном случае Docker не смог найти указанные тома для монтирования.
Настройка
Сначала мне нужно было установить переменную удаленного окружения в моем devcontainer.json
:
"remoteEnv": {
// the original host directory which is needed for volume mount commands from inside the container (Docker in Docker)
"LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}"
}
Затем я использую эту переменную среды docker-compose.yaml
примерно так:
services:
webserver:
build:
context: ./docker
dockerfile: webserver/Dockerfile
image: webserver
container_name: webserver_nginx
ports:
- 8080:80
volumes:
- ${LOCAL_WORKSPACE_FOLDER}/webserver:/etc/nginx/conf.d
- ${LOCAL_WORKSPACE_FOLDER}/build:/var/www/html
restart: unless-stopped
depends_on:
- backend
backend:
...
Проблема
На моей машине (и на машине моих коллег, которые также используют VSCode) все работает нормально. Но у меня есть некоторые участники teams, которые не используют VSCode. Когда я фиксирую адаптированный docker-compose.yaml
файл, их настройка больше не работает, и наоборот, если они снова адаптируют файл к своим потребностям.
Вопрос
Как я могу гарантировать, что Docker compose работает внутри и за пределами VSCode devcontainers
?
Возможные решения?
- Можно ли установить для переменной среды значение по умолчанию?Потому что в моем случае фактическое значение, которое должно быть установлено, если проект не открыт внутри a
devcontainer
, — это просто простая точка (.
) . Потому что, когда я запускаю командуecho ${LOCAL_WORKSPACE_FOLDER}
внутри встроенного терминала VSCode, печатается правильный путь. Похоже, что VSCode просто устанавливает обычные переменные среды? - (Если предположение выше верно) разве нельзя было бы написать простой скрипт Bash
install.sh
, который автоматически задает правильный путь?Этот скрипт следует запускать только один раз во время настройки проекта. Как может выглядеть этот файл?
Комментарии:
1. Почему вы не указываете ‘./ webserver’ в качестве тома? Это должно работать и внутри вашего vscode…
Ответ №1:
Docker compose разрешает значение по умолчанию для переменных:
Значение ${VARIABLE:-default} устанавливается по умолчанию, если ПЕРЕМЕННАЯ не установлена или пуста в среде.
См.: https://docs.docker.com/compose/environment-variables /
Для вашего примера вы можете использовать:
$ {LOCAL_WORKSPACE_FOLDER:-.}
PS: Я никогда не использовал это лично