diff --git a/Dockerfile b/Dockerfile index a3a1f79..464e5ba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,8 +5,14 @@ COPY package.json yarn.lock ./ COPY server/package.json ./server/ RUN yarn install --frozen-lockfile --production +ARG DOCKER_GID=140 + +RUN groupadd -g $DOCKER_GID docker && usermod -aG docker node + WORKDIR /app/server +USER node + COPY server/src ./src COPY server/quests ./quests COPY server/swagger.yaml . diff --git a/Dockerfile.dev b/Dockerfile.dev index ae536bb..43b79ff 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -7,6 +7,12 @@ RUN yarn install --frozen-lockfile WORKDIR /app/server +ARG DOCKER_GID=140 + +RUN groupadd -g $DOCKER_GID docker && usermod -aG docker node + +USER node + ENV NODE_ENV=development ENV HOST=0.0.0.0 ENV PORT=3000 diff --git a/inspect.sh b/inspect.sh new file mode 100755 index 0000000..7f3c41d --- /dev/null +++ b/inspect.sh @@ -0,0 +1,2 @@ +#!/bin/sh +docker compose logs app -f --no-log-prefix diff --git a/server/quests/helloworld/Dockerfile b/server/quests/helloworld/Dockerfile index 1f6751b..6ef8747 100644 --- a/server/quests/helloworld/Dockerfile +++ b/server/quests/helloworld/Dockerfile @@ -4,8 +4,12 @@ RUN apt-get update && apt-get install -y \ curl \ vim -WORKDIR /app +RUN adduser --disabled-password --gecos '' rudeus -COPY . . +USER rudeus -CMD [ "/bin/bash" ] \ No newline at end of file +WORKDIR /home/rudeus + +COPY ./home /home/rudeus/ + +CMD [ "/bin/bash" ] diff --git a/server/quests/helloworld/entrypoint.sh b/server/quests/helloworld/home/.bashrc similarity index 68% rename from server/quests/helloworld/entrypoint.sh rename to server/quests/helloworld/home/.bashrc index f5f4d11..7c4d2bf 100644 --- a/server/quests/helloworld/entrypoint.sh +++ b/server/quests/helloworld/home/.bashrc @@ -1,12 +1,3 @@ -#!/bin/bash - -# enable programmable completion features (you don't need to enable -# this, if it's already enabled in /etc/bash.bashrc and /etc/profile -# sources /etc/bash.bashrc). -#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then -# . /etc/bash_completion -#fi - # This function will be called before each command is executed preexec() { [ -n "$COMP_LINE" ] && return # do nothing if completing diff --git a/server/src/client.js b/server/src/client.js index e4bd7f2..5e30c93 100644 --- a/server/src/client.js +++ b/server/src/client.js @@ -28,7 +28,7 @@ async function main() { console.log(`Session ID: ${sessionId}`) if (!sessionId) exit() - const socket = io('ws://localhost:3000', { + const socket = io(API_ENDPOINT, { query: { session_id: sessionId, }, diff --git a/server/src/config.js b/server/src/config.js index a228473..6b3abf0 100644 --- a/server/src/config.js +++ b/server/src/config.js @@ -6,4 +6,5 @@ export default { db: get('MONGO_URL', 'mongodb://localhost:27017/odyssey-test'), jwtSecret: get('JWT_SECRET', 'secret'), dockerNetwork: get('DOCKER_NETWORK', 'linux-odyssey-players'), + isProduction: process.env.NODE_ENV === 'production', } diff --git a/server/src/utils/docker.js b/server/src/utils/docker.js index 7f5189b..35869cb 100644 --- a/server/src/utils/docker.js +++ b/server/src/utils/docker.js @@ -3,6 +3,8 @@ import config from '../config.js' const engine = new Docker() +const questPath = '/home/zeko/src/linux-odyssey/server/quests' + const containerOptions = { Image: 'lancatlin/quest-helloworld', AttachStdin: true, @@ -12,23 +14,34 @@ const containerOptions = { Cmd: ['/bin/bash'], OpenStdin: true, StdinOnce: false, + HostConfig: { + Binds: config.isProduction + ? [] + : [`${questPath}/helloworld/home:/home/rudeus`], + }, } const network = engine.getNetwork(config.dockerNetwork) export async function getOrCreateContainer(id) { console.log(`Getting container: ${id}`) + let container try { - const container = engine.getContainer(id) + container = engine.getContainer(id) if (!(await container.inspect()).State.Running) { await container.start() } return container } catch (error) { - const container = await engine.createContainer({ - ...containerOptions, - name: id, - }) + try { + container = await engine.createContainer({ + ...containerOptions, + name: id, + }) + } catch (error) { + console.log(error) + throw error + } await network.connect({ Container: container.id }) await container.start()