a year ago
Hello guys,
I'm completely new to this hosting stuff and I'm trying to host a discord bot that I used to start locally from VS Studio before.
I hooked up my github and try to deploy the container.
Id: 24415e1c-9ff5-4133-b834-05af53c29590
Build suceeds but deploy crashes with following message:
Unhandled exception. System.TypeLoadException: Could not load type System.Runtime.CompilerServices.NullableContextAttribute from assembly System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. at System.ModuleHandle.ResolveType(QCallModule module, Int32 typeToken, IntPtr* typeInstArgs, Int32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type) at System.ModuleHandle.ResolveTypeHandle(Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext) at System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) at System.Reflection.CustomAttribute.FilterCustomAttributeRecord(MetadataToken caCtorToken, MetadataImport& scope, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, ListBuilder`1& derivedAttributes, RuntimeType& attributeType, IRuntimeMethodInfo& ctorWithParameters, Boolean& isVarArg) at System.Reflection.CustomAttribute.IsCustomAttributeDefined(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, RuntimeType attributeFilterType, Int32 attributeCtorToken, Boolean mustBeInheritable) at System.Reflection.CustomAttribute.IsDefined(RuntimeType type, RuntimeType caType, Boolean inherit) at System.Diagnostics.StackTrace.ToString(TraceFormat traceFormat, StringBuilder sb) at System.Diagnostics.StackTrace.ToString(TraceFormat traceFormat) at System.Exception.get_StackTrace() at System.Exception.ToString() at Program.Main(String[] args) in /app/SubBot/Program.cs:line 44 at Program.<main>(String[] args)
118 Replies
a year ago
Are you using nixpacks or a Dockerfile?
a year ago
It looks like you are running a .NET 8.0 project on the wrong version (.NET 6.0?)
That's the build log.
Region: europe-west4]
Using Nixpacks
context: rpk8-2czM
╔═════════════════════ Nixpacks v1.34.1 ═════════════════════╗
║ setup │ dotnet-sdk_8 ║
║────────────────────────────────────────────────────────────║
║ install │ dotnet restore ║
║────────────────────────────────────────────────────────────║
║ build │ dotnet publish --no-restore -c Release -o out ║
║────────────────────────────────────────────────────────────║
║ start │ ./out/SubBot ║
╚════════════════════════════════════════════════════════════╝
[internal] load build definition from Dockerfile
[internal] load build definition from Dockerfile ✔ 0ms
[internal] load build definition from Dockerfile
[internal] load build definition from Dockerfile ✔ 10ms
[internal] load metadata for ghcr.io/railwayapp/nixpacks:ubuntu-1741046653
[internal] load metadata for ghcr.io/railwayapp/nixpacks:ubuntu-1741046653 ✔ 149ms
[internal] load .dockerignore
[internal] load .dockerignore
[internal] load .dockerignore ✔ 0ms
[internal] load .dockerignore
[internal] load .dockerignore ✔ 11ms
[internal] load build context ✔ 0ms
[internal] load build context
[internal] load build context ✔ 637ms
[3/9] COPY .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix ✔ 0ms – CACHED
[4/9] RUN nix-env -if .nixpacks/nixpkgs-5148520bfab61f99fd25fb9ff7bfbb50dad3c9db.nix && nix-collect-garbage -d ✔ 0ms – CACHED
[5/9] COPY . /app/.
[5/9] COPY . /app/. ✔ 154ms
[6/9] RUN dotnet restore
Welcome to .NET 8.0!
SDK Version: 8.0.100-preview.5.23303.2
a year ago
set the ENV NIXPACKSCSHARPSDK_VERSION=8.0.311
a year ago
It shouldnt use Nixpacks if you have a dockerfile though
a year ago
This is my Dockerfile, make sure its in your base directory (of your github repo)
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app
# Copy and restore dependencies
COPY . .
RUN dotnet restore
# Publish the application
RUN dotnet publish -c Release -o /out
# Use a lightweight runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /out .
# Set the entry point
ENTRYPOINT ["dotnet", "Discord Bot.dll"]This is mine:
`# Build-Phase mit SDK
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["SubBot/SubBot.csproj", "SubBot/"]
COPY . .
WORKDIR "/src/SubBot"
RUN dotnet publish "SubBot.csproj" -c Release -r linux-x64 --self-contained true -o /app/publish /p:PublishSingleFile=true /p:PublishTrimmed=false
Minimaler Runtime-Container – ohne dotnet runtime
FROM debian:bullseye-slim AS final
WORKDIR /app
COPY --from=build /app/publish .
RUN chmod +x SubBot
ENTRYPOINT ["./SubBot"]`

a year ago
Is that the base directory for your repo? For mine, I have the Dockerfile in the solution directory.

a year ago
Yes, that is the git repo's base directory since it has the .git folder in it
a year ago
Nah its fine
now im getting this error:
✕ [build 6/6] RUN dotnet publish "SubBot.csproj" -c Release -r linux-x64 --self-contained true -o /app/publish /p:PublishSingleFile=true /p:PublishTrimmed=false
process "/bin/sh -c dotnet publish \"SubBot.csproj\" -c Release -r linux-x64 --self-contained true -o /app/publish /p:PublishSingleFile=true /p:PublishTrimmed=false" did not complete successfully: exit code: 145
`The command could not be loaded, possibly because:
You intended to execute a .NET application:
The application 'publish' does not exist.You intended to execute a .NET SDK command:
A compatible .NET SDK was not found.
Requested SDK version: 8.0.100
global.json file: /src/SubBot/global.json
Installed SDKs:
Install the [8.0.100] .NET SDK or update [/src/SubBot/global.json] to match an installed SDK.
Learn about SDK resolution:
https://aka.ms/dotnet/sdk-not-found`
a year ago
I believe you just need to change all of the SubBot.csproj instances with ./SubBot.csproj
a year ago
Since you moved the Dockerfile to a different directory
a year ago
Yes
a year ago
should look like that

i changed my dockerfile to this self containing thing. should i try yours and change the names obviously?
a year ago
Wait sorry it should be ./SubBot/SubBot.csproj
a year ago
Uh
a year ago
Yeah one sec
a year ago
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app
# Copy and restore dependencies
COPY . .
RUN dotnet restore
# Publish the application
RUN dotnet publish -c Release -o /out
# Use a lightweight runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /out .
# Set the entry point
ENTRYPOINT ["dotnet", "Discord Bot.dll"]a year ago
This is a pretty bare bones one
a year ago
# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
USER $APP_UID
WORKDIR /app
# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Whispbot.csproj", "."]
RUN dotnet restore "./Whispbot.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "./Whispbot.csproj" -c $BUILD_CONFIGURATION -o /app/build
# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Whispbot.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Whispbot.dll"]This is the official visual studio one
a year ago
I have my project and solution in the same directory so you would have to change the stuff around slightly
a year ago
When I created my newest project, I set it up to use the dockerfile by default
a year ago
On visual studio
a year ago
I dont think you can change it now
a year ago
But ill generate a dockerfile for you
`# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
USER $APP_UID
WORKDIR /app
This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILDCONFIGURATION=Release WORKDIR /src COPY ["SubBot/SubBot.csproj", "SubBot/"] RUN dotnet restore "SubBot/SubBot.csproj" COPY . . WORKDIR "/src/SubBot" RUN dotnet build "./SubBot.csproj" -c $BUILDCONFIGURATION -o /app/build
This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
ARG BUILDCONFIGURATION=Release RUN dotnet publish "./SubBot.csproj" -c $BUILDCONFIGURATION -o /app/publish /p:UseAppHost=false
This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["./SubBot", "SubBot.dll"]`
i haave this now
a year ago
I would assume that would work if you change the RUN dotnet line to have "./SubBot/SubBot.csproj" and the entrypoint to be ["dotnet", "SubBot.dll"]
a year ago
Dotnet = .NET
```# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
USER $APP_UID
WORKDIR /app
This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILDCONFIGURATION=Release WORKDIR /src COPY ["SubBot/SubBot.csproj", "SubBot/"] RUN dotnet restore "SubBot/SubBot.csproj" COPY . . WORKDIR "/src/SubBot" RUN dotnet build "./SubBot/SubBot.csproj" -c $BUILDCONFIGURATION -o /app/build
This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
ARG BUILDCONFIGURATION=Release RUN dotnet publish "./SubBot/SubBot.csproj" -c $BUILDCONFIGURATION -o /app/publish /p:UseAppHost=false
This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SubBot.dll"]```
looks like this now
a year ago
Its the CLI for c#
a year ago
That looks correct
The command could not be loaded, possibly because:
You intended to execute a .NET application:
The application 'build' does not exist.You intended to execute a .NET SDK command:
A compatible .NET SDK was not found.
Requested SDK version: 8.0.100
global.json file: /src/SubBot/global.json
Installed SDKs:
Install the [8.0.100] .NET SDK or update [/src/SubBot/global.json] to match an installed SDK.
Learn about SDK resolution:
https://aka.ms/dotnet/sdk-not-found
a year ago
yeah
a year ago
its interfering with it
`MSBUILD : error MSB1009: Project file does not exist.
Switch: ./SubBot/SubBot.csproj
✕ [build 7/7] RUN dotnet build "./SubBot/SubBot.csproj" -c Release -o /app/build
process "/bin/sh -c dotnet build \"./SubBot/SubBot.csproj\" -c $BUILD_CONFIGURATION -o /app/build" did not complete successfully: exit code: 1
Dockerfile:16
14 | COPY . .
15 | WORKDIR "/src/SubBot"
16 | >>> RUN dotnet build "./SubBot/SubBot.csproj" -c $BUILD_CONFIGURATION -o /app/build
17 |
18 | # This stage is used to publish the service project to be copied to the final stage
ERROR: failed to solve: process "/bin/sh -c dotnet build \"./SubBot/SubBot.csproj\" -c $BUILD_CONFIGURATION -o /app/build" did not complete successfully: exit code: 1`
<:KEKW:947842215005286460>
oh boi i guess its a path thing
a year ago
uhhhhhhhhhhhhhhhhh
a year ago
Oh okay im stupid
a year ago
RUN dotnet build "SubBot.csproj"
a year ago
do that
a year ago
I told you to change that one
a year ago
and the same with publish
The configuration file 'appsettings.json' was not found and is not optional. The expected physical path was '/app/appsettings.json'.
need to replace the config logic with the enviroment logic from raailway for tokens i guess
a year ago
Or you can put it in a volume
a year ago
But for tokens definitely use ENV
a year ago
service unless you are using the token across multiple services which is unlikely (e.g. you have a main bot and an seperate API service)
a year ago
if you arent planning on using ENVs on more than one service then use the service variables
nah its just a simple bot for registering substitute players.
i need to connect a database now.
That was the reason to try railway because i didnt want to host a db myself locally
a year ago
i created a custom discord api wrapper package for my bots
a year ago
i dont use any packages
Ah, okay nice.
And if I read thatr correctly i log to Console.WriteLine(); to see it in Railway?
a year ago
Yes
a year ago
I was bored
a year ago
No problem
a year ago
very
a year ago
ive never tried it
a year ago
you could probably use an external program like tableplus to run SQL queries on the database
Ah yea, i can connect to the db from my computer and run it there. im using heidisql
a year ago
yeah that should work
a year ago
the database should have a public and a private url
a year ago
use public to connect to it externally and the private to connect to it on your main program when running on railway (to save on egress costs)
a year ago
yes
a year ago
that should be the public one
a year ago
Yup
_connectionString = enviroment.mysql.DATABASE_URL; MySqlConnection connection = new MySqlConnection(_connectionString); try { await connection.OpenAsync(); Console.WriteLine("Die Verbindung zur HL-Datenbank wurde erfolgreich geöffnet."); return connection; } catch (Exception ex) { Console.WriteLine("Fehler beim Öffnen der Verbindung zur HL-Datenbank: " + ex.Message); return new MySqlConnection(); }
that would be my guess to connect internally
a year ago
Yes, Is environment a custom class or?
a year ago
it should be
Environment.GetEnvironmentVariable("DATABASE_URL")do i have to insert the databse variables into my service variables or are they "gobally" by default?
a year ago
you would have to insert them
a year ago
${{MySql.DATABASE_URL}}
a year ago
Or whatever
How do you debug your bot when its running on railway?
Is it the old write logs, deploy and repeat thing? 😄
a year ago
ofcourse

a year ago
no problem!
a year ago
relatable
a year ago
looks like we’re good to call this solved?
a year ago
Yup
a year ago
!s
Status changed to Solved adam • 11 months ago



