Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Option to skip COPY . /app #1037

Open
emdede opened this issue Dec 29, 2023 · 6 comments
Open

Option to skip COPY . /app #1037

emdede opened this issue Dec 29, 2023 · 6 comments
Labels
bug Something isn't working community

Comments

@emdede
Copy link

emdede commented Dec 29, 2023

Feature request

It would be great to be able to exclude directories/files that are not supposed to end up in the image.

It was my impression that you would be able to set onlyIncludeFiles = [] for a phase so you could overwrite default behavior but no matter what phase I hook into, in the end there's always a COPY . /app and I can't find a way to disable this behavior. I went through the docs and GH issues but I can't find a solution. Is there a way that I am not seeing or is it not possible? This is relevant for monorepos containing different applications. But even not taking into account monorepos, I think this would potentially help keep images leaner as a whole.

As an example, this is a very simple project structure to show a clear use-case of this:

|-- common/
|-- project1/
  |-- src/
  |-- nixfile.toml
|-- project2/
  |-- src/
  |-- nixfile.toml
|-- package.json
|-- package-lock.json

If I want to build project1 (nixpacks build -c=./project1/nixfile.toml .) which is independent of project2, I can't currently ignore project2's code.

Copy link
Contributor

Hello, @emdede! Thanks for your submission.

Our team will respond soon. If you need more immediate help, try our Forum or our Discord. Thanks!

@aleksrutins
Copy link
Contributor

Are you sure it's including them in the final image and not just for the build step?

@emdede
Copy link
Author

emdede commented Dec 30, 2023

Are you sure it's including them in the final image and not just for the build step?

Positive. I checked in the running container.

nixpacks plan

{
  "providers": [],
  "buildImage": "ghcr.io/railwayapp/nixpacks:ubuntu-1702339400",
  "variables": {
    "NIXPACKS_METADATA": "python,poetry",
    "NIXPACKS_POETRY_VERSION": "1.7.1",
    "PYTHONUNBUFFERED": "1"
  },
  "phases": {
    "install": {
      "dependsOn": [
        "setup"
      ],
      "cmds": [
        "python -m venv --copies /opt/venv && . /opt/venv/bin/activate && pip install poetry==$NIXPACKS_POETRY_VERSION && poetry install --without dev --no-interaction --no-ansi"
      ],
      "onlyIncludeFiles": [
        "common",
        "my-app",
        "poetry.lock",
        "pyproject.toml"
      ],
      "cacheDirectories": [
        "/root/.cache/pip"
      ],
      "paths": [
        "/opt/venv/bin"
      ]
    },
    "setup": {
      "nixPkgs": [
        "python310",
        "gcc",
        "libmysqlclient.dev"
      ],
      "nixLibs": [
        "zlib",
        "stdenv.cc.cc.lib"
      ],
      "nixOverlays": [],
      "nixpkgsArchive": "5148520bfab61f99fd25fb9ff7bfbb50dad3c9db"
    }
  },
  "start": {
    "cmd": "my-start-command"
  }
}

.nixpacks/Dockerfile

FROM ghcr.io/railwayapp/nixpacks:ubuntu-1702339400

ENTRYPOINT ["/bin/bash", "-l", "-c"]
WORKDIR /app/


COPY .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix
RUN nix-env -if .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix && nix-collect-garbage -d


ARG NIXPACKS_METADATA NIXPACKS_POETRY_VERSION PYTHONUNBUFFERED
ENV NIXPACKS_METADATA=$NIXPACKS_METADATA NIXPACKS_POETRY_VERSION=$NIXPACKS_POETRY_VERSION PYTHONUNBUFFERED=$PYTHONUNBUFFERED

# setup phase
# noop

# install phase
ENV NIXPACKS_PATH /opt/venv/bin:$NIXPACKS_PATH
COPY common /app/common
COPY my-app /app/my-app
COPY poetry.lock /app/poetry.lock
COPY pyproject.toml /app/pyproject.toml
RUN --mount=type=cache,id=tE9G8SvyOg4-/root/cache/pip,target=/root/.cache/pip python -m venv --copies /opt/venv && . /opt/venv/bin/activate && pip install poetry==$NIXPACKS_POETRY_VERSION && poetry install --without dev --no-interaction --no-ansi


RUN printf '\nPATH=/opt/venv/bin:$PATH' >> /root/.profile

# start
COPY . /app
CMD ["my-start-command"]

I've added these to the nixfile.toml with no change

[phases.build]
onlyIncludeFiles = []

[start]
onlyIncludeFiles = []

@coffee-cup
Copy link
Contributor

This looks to be a bug with Nixpacks where it will always copy over all files before starting if there is no other runImage specified.

@coffee-cup coffee-cup added the bug Something isn't working label Jan 11, 2024
@dush-t
Copy link

dush-t commented Jan 15, 2024

Would love to attempt a fix if this is up for taking. Can you provide a minimum list of steps to reproduce this? I believe a simple ignore key in the nixfile should be sufficient to fix this.

@jclaveau
Copy link

jclaveau commented May 22, 2024

This looks to be a bug with Nixpacks where it will always copy over all files before starting if there is no other runImage specified.

I confirm that this remove the unexpected COPY . /app which, in my case, breaks while trying to recopy over symlinks created during the build step.

I'm runing nixpacks 1.21.3

Btw, I personnaly have a COPY . /app at each step:

FROM ghcr.io/railwayapp/nixpacks:ubuntu-1711411379

ENTRYPOINT ["/bin/bash", "-l", "-c"]
WORKDIR /app/


COPY .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix
RUN nix-env -if .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix && nix-collect-garbage -d
COPY .nixpacks/nixpkgs-bf744fe90419885eefced41b3e5ae442d732712d.nix .nixpacks/nixpkgs-bf744fe90419885eefced41b3e5ae442d732712d.nix
RUN nix-env -if .nixpacks/nixpkgs-bf744fe90419885eefced41b3e5ae442d732712d.nix && nix-collect-garbage -d
RUN sudo apt-get update && sudo apt-get install -y --no-install-recommends libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libgbm1 libasound2 libpangocairo-1.0-0 libxss1 libgtk-3-0 libxshmfence1 libglu1

ARG CI NIXPACKS_METADATA NODE_ENV NPM_CONFIG_PRODUCTION PYTHONUNBUFFERED
ENV CI=$CI NIXPACKS_METADATA=$NIXPACKS_METADATA NODE_ENV=$NODE_ENV NPM_CONFIG_PRODUCTION=$NPM_CONFIG_PRODUCTION PYTHONUNBUFFERED=$PYTHONUNBUFFERED

# python:setup phase
# noop

# setup phase
# noop

# install phase
ENV NIXPACKS_PATH /app/node_modules/.bin:$NIXPACKS_PATH
COPY . /app/.
RUN --mount=type=cache,id=BzTYrNyrok-/root/local/share/pnpm/store/v3,target=/root/.local/share/pnpm/store/v3 npm install -g corepack
RUN --mount=type=cache,id=BzTYrNyrok-/root/local/share/pnpm/store/v3,target=/root/.local/share/pnpm/store/v3 corepack enable
RUN --mount=type=cache,id=BzTYrNyrok-/root/local/share/pnpm/store/v3,target=/root/.local/share/pnpm/store/v3 corepack prepare pnpm@9.1.0 --activate
RUN --mount=type=cache,id=BzTYrNyrok-/root/local/share/pnpm/store/v3,target=/root/.local/share/pnpm/store/v3 pnpm install --frozen-lockfile

# python:install phase
# noop

# build phase
COPY . /app/.
RUN --mount=type=cache,id=BzTYrNyrok-node_modules/cache,target=/app/node_modules/.cache pnpm --filter .... build



RUN printf '\nPATH=/app/node_modules/.bin:$PATH' >> /root/.profile



# start
COPY . /app
CMD ["pnpm start"]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working community
Projects
None yet
Development

No branches or pull requests

5 participants