I have been trying to set up the automatic build of my Dockerfile (located in a subdirectory) using Github Actions.
My directory structure is as follows:
app
├── .github
│ ├── workflows
│ │ └── build.yml
├── encoding
│ ├── encoder.py
│ └── Dockerfile
├── database
│ └── Dockerfile
├── db
└── <data>
[...]
├── poetry.lock
├── pyproject.toml
├── LICENSE
└── README.md
My build.yml
is as follows (for limitation purposes, only included the build of the encoding
step):
name: Build
on:
push:
branches: [ main ]
defaults:
run:
shell: bash
jobs:
encoding_build:
runs-on: self-hosted
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to private Docker registry
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.8'
- name: Build Docker image
uses: docker/build-push-action@v2
with:
context: ../../../encoding
dockerfile: ./encoding/Dockerfile
push: true
tags: <username>/<project_name>:<tag>
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
And my Dockerfile is the following:
FROM python:3.8
WORKDIR /app/
ADD ./pyproject.toml /tmp/
ADD ./poetry.lock /tmp/
RUN cp /tmp/pyproject.toml /tmp/poetry.lock /app/
RUN pip install poetry
RUN poetry config virtualenvs.create false && poetry install --no-root --no-dev -vvv
COPY encoder.py /app/
WORKDIR /app/
CMD ["python", "encoder.py", "--input_file", "/app/input.txt", "--output_file", "/app/output.txt", "--model_name_or_path", "bert-base-uncased"]
I have checked this SO question, and I created my context and dockerfile arguments based on the answers of vivekyad4v and Sal Borrelli there; yet the automated build doesn't seem to work. When pushing any changes to my repository, I am getting the following error:
Error: buildx failed with: ERROR: unable to prepare context: path "../../../encoding" not found
How can I resolve my error?
Hey your context path is incorrect I believe.
You could try something like this:
with:
context: ./encoding
file: ./encoding/Dockerfile
Your current working directory should already be /app
.
And the context
in your build.yml
like for the dockerfile
will be resolved using the current working directory.