mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-05 19:20:12 +08:00
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:
1 parent
860b257ea7
commit
1888781a47
5 files changed
+32
-23
No files matched your search
+13
-9
@@ -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
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user