У меня есть файл docker-compose.yml и файл Docker. Я добавил привязное крепление. Если я не попытаюсь скомпилировать или выполнить какие-либо команды mix, получаю docker-compose для «up» и запускаю интерактивную оболочку. На самом деле я вижу том «bind» и все файлы.
Проблема в том, что когда я пытаюсь выполнить команду cd или выполнить команду в этом каталоге - она как бы не существует и «возвращает код выхода с 1» ошибка
докер-compose.yml
# Version of docker-compose
version: '3.7'
# Containers we are going to run
services:
# Our Phoenix container
phoenix:
# The build parameters for this container.
build:
# Here we define that it should build from the current directory
context: .
environment:
# Variables to connect to our Postgres server
PGUSER: gametime_dev
PGPASSWORD: gametime-dev
PGDATABASE: gametime_dev
PGPORT: 5432
# Hostname of our Postgres container
PGHOST: db
ports:
# Mapping the port to make the Phoenix app accessible outside of the container
- "4000:4000"
depends_on:
# The db container needs to be started before we start this container
- db
- redis
volumes:
- type: bind
source: .
target: /opt/gametime
redis:
image: "redis:alpine"
ports:
- "6379:6379"
sysctls:
net.core.somaxconn: 1024
db:
# We use the predefined Postgres image
image: kartoza/postgis:11.0-2.5
environment:
# Set user/password for Postgres
POSTGRES_USER: gametime_dev
POSTGRES_PASS: gametime-dev
# Set a path where Postgres should store the data
PGDATA: /var/lib/postgresql/data/pgdata
restart: always
volumes:
- pgdata:/usr/local/var/postgres_data
# Define the volumes
volumes:
pgdata:
Dockerfile:
# Latest version of Erlang-based Elixir installation: https://hub.docker.com/_/elixir/
FROM bitwalker/alpine-elixir-phoenix as build
RUN apk update && \
apk add postgresql-client
# Create and set home directory
ENV HOME /opt/gametime WORKDIR $HOME
# Configure required environment
ENV MIX_ENV dev # Set and expose PORT environmental variable
ENV PORT ${PORT:-4000}
EXPOSE $PORT
VOLUME /opt/gametime
# Install hex (Elixir package manager)
RUN mix local.hex --force
# Install rebar (Erlang build tool) RUN mix local.rebar --force
# Copy all dependencies files
# not commenting this out defeats the purpose of needing the volume
# COPY mix.* ./
# Install all production dependencies RUN mix deps.get --only dev
# Compile all dependencies
#THIS FAILS - BECAUSE IT CAN'T FIND THE mix.exs file
RUN mix deps.compile
# Copy all application files # COPY . .
# Compile the entire project
RUN mix compile
# IF I COMMENT OUT THE ABOVE THIS ALSO FAILS BECAUSE IT CAN'T FIND ASSETS DIRECTORY
RUN cd assets && npm install
CMD ["./entrypoint.sh"]
Ошибка:
Step 11/15 : RUN mix deps.get --only dev
---> Running in 831e2e0d3fe2
** (Mix) Could not find a Mix.Project, please ensure you are running
Mix in a directory with a mix.exs file
ERROR: Service 'phoenix' failed to build: The command '/bin/sh -c mix
deps.get --only dev' returned a non-zero code: 1
Что я пытаюсь сделать - это РАЗДЕЛИТЬ каталог приложения и использовать библиотеки elixir / erlang / OTP в контейнере для сборки и запуска этого кода. Таким образом, у меня будет среда разработки, и любые сделанные мной изменения будут сохранены на моем локальном компьютере.
Я могу получить данные из github, чтобы быть честными, и затем зафиксировать изменения, прежде чем уничтожить мой контейнер. Но я хотел сначала попробовать это.
[ОБНОВЛЕНИЕ]: Итак, я понял, что, если я запускаю команды микширования в файле entrypoiont.sh
, все работает просто отлично. Я не знаю, почему том недоступен в Dockerfile и по этой причине не ответил на мой собственный вопрос. Я получил ключ от здесь .
Причина, по которой я хотел сделать это - кешировать шаги deps.get
и deps.compile
как слой, чтобы мне не приходилось делать это каждый раз, когда я запускаю docker-compose up