fix: copy entrypoint into quest container. Disable mounting for entrypoint & public key. Use Env to pass ssh public key into container.

This commit is contained in:
Justin Lin committed 2024-10-21 11:54:32 +08:00
1 parent 860b257ea7
commit 1888781a47
5 files changed
+32 -23

No files matched your search

+13 -9
View File
@@ -32,13 +32,20 @@ services:
- ./config:/app/config
env_file:
- .env
- .env.prod
environment:
- MONGO_URL=mongodb://${MONGO_USER}:${MONGO_PASSWORD}@db:27017/${MONGO_DB}
- MONGO_URL=mongodb://${MONGO_USER}:${MONGO_PASS}@db:27017/${MONGO_DB}
- DOCKER_NETWORK=linux-odyssey-players
- SECRET_KEY=${SECRET_KEY}
- TRUSTED_PROXIES=${TRUSTED_PROXIES}
- BACKEND_URL=http://backend:3000
- BASE_URL=${BASE_URL}
- GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
- GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET}
- GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
- GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
- SURVEY_URL=${SURVEY_URL}
- BUG_REPORT_URL=${BUG_REPORT_URL}
analytics:
image: linuxodyssey/analytics
@@ -53,8 +60,11 @@ services:
- internal
ports:
- '3001:3001'
env_file:
- .env
- .env.prod
environment:
- MONGO_URL=mongodb://${MONGO_USER}:${MONGO_PASSWORD}@db:27017/${MONGO_DB}
- MONGO_URL=mongodb://${MONGO_USER}:${MONGO_PASS}@db:27017/${MONGO_DB}
- ADMIN_USERNAME=${ADMIN_USERNAME}
- ADMIN_PASSWORD=${ADMIN_PASSWORD}
@@ -73,14 +83,8 @@ services:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD}
- MONGO_USER=${MONGO_USER}
- MONGO_PASS=${MONGO_PASSWORD}
- MONGO_PASS=${MONGO_PASS}
- MONGO_DB=${MONGO_DB}
- GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
- GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET}
- GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
- GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
- SURVEY_URL=${SURVEY_URL}
- BUG_REPORT_URL=${BUG_REPORT_URL}
base:
image: linuxodyssey/quest-base
+1 -4
View File
@@ -13,15 +13,12 @@ services:
base:
image: linuxodyssey/quest-base
networks:
- players
- players
build:
context: .
dockerfile: ./quests/Dockerfile
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
# - ./config/ssh_key.pub:/ssh_key.pub:ro
- ./quests/entrypoint.sh:/entrypoint.sh:ro
networks:
internal:
+1
View File
@@ -25,6 +25,7 @@ RUN rm -f /etc/motd /etc/issue /etc/issue.net /etc/update-motd.d/*
RUN rm -rf /etc/skel && mkdir -p /etc/skel
RUN mkdir -p /etc/ssh/authorized_keys && chmod 755 /etc/ssh/authorized_keys
COPY ./quests/.includes/sshd_config /etc/ssh/sshd_config
COPY ./quests/entrypoint.sh /entrypoint.sh
EXPOSE 22
+4 -3
View File
@@ -10,9 +10,10 @@ if ! id -u ${USERNAME} >/dev/null 2>&1; then
find / -name ".gitkeep" -type f -exec rm -f {} +
echo "Adding public key for $USERNAME"
PUB_KEY=/etc/ssh/authorized_keys/${USERNAME}
cp /ssh_key.pub ${PUB_KEY}
chmod 644 ${PUB_KEY}
echo "Public key: $PUB_KEY"
PUB_KEY_PATH=/etc/ssh/authorized_keys/${USERNAME}
echo $PUB_KEY > ${PUB_KEY_PATH}
chmod 644 ${PUB_KEY_PATH}
fi
mkdir -p /run/sshd
+13 -7
View File
@@ -24,6 +24,7 @@ const newContainerOptions = (
ExposedPorts: {
'22/tcp': {},
},
Env: [`PUB_KEY=${config.docker.keypair.publicKey}`],
})
export async function createContainer(
@@ -32,21 +33,23 @@ export async function createContainer(
imageId: string
): Promise<Docker.Container> {
let binds: string[] = [
`${config.projectRoot}/config/ssh_key.pub:/ssh_key.pub:ro`,
`${config.projectRoot}/quests/entrypoint.sh:/entrypoint.sh:ro`,
// `${config.docker.hostProjectRoot}/config/ssh_key.pub:/ssh_key.pub:ro`,
]
if (await questHomeExists(questId)) {
logger.info('Mounting quest home', questId)
binds.push(`${config.projectRoot}/quests/${questId}/home:/etc/skel:ro`)
binds.push(
`${config.docker.hostProjectRoot}/quests/${questId}/home:/etc/skel:ro`
)
}
if (!config.isProduction && config.docker.mountQuest && imageId !== 'base') {
logger.info('Mounting quest folder', questId)
binds = [
`${config.projectRoot}/quests/${questId}/home:/home/commander`,
`${config.projectRoot}/packages/container:/usr/local/lib/container`,
`${config.docker.hostProjectRoot}/quests/${questId}/home:/home/commander`,
`${config.docker.hostProjectRoot}/packages/container:/usr/local/lib/container`,
]
}
const option = newContainerOptions(name, imageId, { binds })
console.log('Creating container', option)
await createNetworkIfNotExists(config.docker.network)
return engine.createContainer(option)
}
@@ -65,7 +68,9 @@ async function createNetworkIfNotExists(network: string) {
async function questHomeExists(imageId: string) {
try {
const stat = await fs.stat(`${config.projectRoot}/quests/${imageId}/home`)
const stat = await fs.stat(
`${config.docker.hostProjectRoot}/quests/${imageId}/home`
)
return stat.isDirectory()
} catch {
return false
@@ -99,7 +104,8 @@ export async function attachContainer(
// eslint-disable-next-line no-await-in-loop
const stream = await connectToSSH(containerIp, { token })
return stream
} catch {
} catch (err) {
logger.error('Failed to connect to SSH', err)
// eslint-disable-next-line no-await-in-loop
await new Promise((resolve) => {
setTimeout(resolve, 1000)