I am trying to share libraries between two different apps.
Local project structure looks like this:
├── Dockerfile-A
├── Dockerfile-B
├── app-libs
│ └── src
├── app-first
│ ├── docker-compose.yml
│ ├── container-first
│ │ └── src (an app)
│ ├── container-second
│ │ ├── Dockerfile
│ │ └── src (a daemon)
│ └── container-third
│ ├── Dockerfile
│ └── src (a daemon)
└── app-second
└── src (an app)
The first app is a multicontainer and the second is a single.
The single container app works just fine when doing a balena build -a app-second --dockerfile Dockerfile-B
from the top level. Both the libraries and the application get copied into the container.
Dockerfile-B
relevant lines:
WORKDIR /app/app-libs
COPY ./app-libs ./
WORKDIR /app/app-second
COPY ./app-second ./
This is expected as the Docker context is inferred to be the current working directory, the top level, and all COPY
paths are accessible below that.
The multicontainer app cannot copy things the same way for its first container as it requires a docker-compose.yml
.
Dockerfile-A
relevant lines:
WORKDIR /app/app-libs
COPY ./app-libs ./
WORKDIR /app/container-first
COPY ./app-first/container-first ./
docker-compose.yml
relevant lines:
services:
container-first:
build:
context: ../
dockerfile: ./Dockerfile-A
That is, balena build
can’t be run from the top level because the docker-compose.yml
needs to be present and can’t be passed as an argument. And when not run from the top level, Docker complains about not being able to copy the app-libs
folder since it’s above the Docker context.
A plain docker build
for app-second
or a docker-compose build
for app-first
work fine.
cd app-first && docker-compose build
cd .. && docker build -f Dockerfile-B .