git clone https://github.com/martindsouza/docker-oracle-sqlcl
cd docker-oracle-sqlcl
# *** Copy the downloaded sqlcl.zip file into the files directory ***
cp ~/Downloads/sqlcl-.*.zip files/
# Build the image
docker build \
-t oracle-sqlcl:20.2.0 \
-t oracle-sqlcl:latest \
.
The following is focused on MacOS / Linux users.
- Create alias
- Note: the wrapping single quotes
'
instead of a double quote"
which preventspwd
from being evaluated during the alias definition
- Note: the wrapping single quotes
alias sqlcl='docker run -it --rm \
--network="host" \
-v `pwd`:/sqlcl \
-v ~/Documents/Oracle/:/oracle \
-e TNS_ADMIN=$TNS_ADMIN \
oracle-sqlcl:latest'
To persist add the alias
command to ~/.bash_profile
. If using zsh then add to ~/.zshrc
.
A few things about the parameters:
Parameter | Description |
---|---|
--network="host" |
This will mimic the current host networking (with the goal of acting like a binary) |
-v ``pwd``:/sqlcl |
This will set the current directory that sqlcl is run to the one that the container is looking at |
-v ~/Documents/Oracle/:/oracle |
(optional) for login.sql to load startup scripts |
- To execute:
sqlcl <connection string>
Note: For the <connection string>
it usually looks something like sqlcl giffy/giffy@localhost:32118/xepdb1
. If you're referencing a port that is being tunneled by host machine (i.e. laptop) localhost
doesn't seem to work. Instead use host.docker.internal
to reference the host machine. Ex: sqlcl giffy/giffy@host.docker.internal:32118/xepdb1
.
Volume | Description |
---|---|
/sqlcl |
This is the folder that SQLcl will reference |
/oracle |
This is the folder that you will put login.sql and can load alias from here. Ex: alias load /oracle/sqlcl-alias.xml . Note the reference is to the container's local /oracle folder and not your full path. |
The container has a mapped volume called /oracle/
. In it you can add files for SQLcl to reference. The listings below cover each type of file.
login.sql
allows you to store commands that you'd like SQLcl to run on init. An example is:
-- Add a reminder where to find this file on your laptop
-- Again in the Container it's mapped to /oracle/#.sql
prompt Settings in ~/Documents/Oracle/login.sql
prompt Remember this is in a Container and all referenced files must be from Containers point of view
set serveroutput on
set sqlformat ansiconsole
-- Alias will be covered below
prompt To manage aliases: ~/Documents/Oracle/sqlcl-alias.xml
alias load /oracle/sqlcl-alias.xml
SQLcl allow for aliases (not to be confused with Bash based aliases). Theres' lots of great examples on how to use them and one of the better ones is found here.
To load an alias see the previous login.sql
file example. You should store aliases in the same folder as login.sql
as it is all mapped to the /oracle/
folder in the Container
When connecting to an Oracle Cloud (OCI) Autonomous Transaction Processing (ATP) database you'll need to reference a folder that contains the wallet information provided by the ATP instance docs.
In the examples above we've mapped ~/Documents/Oracle/
(laptop) to /oracle
(container) volume. To handle the OCI wallet requirement do the following.
On your laptop:
- Put the wallet files in
~/Documents/Oracle/wallets/atp01
(whereatp01
is the folder container the wallet files for a given ATP instance. Note that the folder name is entirely what you want to call it) - Set the
TNS_ADMIN
variable. This needs to be how the container will reference the folder. In this example it would be:TNS_ADMIN=/oracle/wallets/atp01
- Connect to the ATP instance using the
sqlcl
alias.
Full example:
TNS_ADMIN=/oracle/wallets/atp01
sqlcl admin/myatp_password@atp01_high
SQL>
When you try to run sqlcl
using the Oracle Wallet you may get the error ORA-28759: failure to open file
(see #13 for more info). This is because of a mapping in the sqlnet.ora
file that is provided with it. Note in our example sqlnet.ora
would be in the unzipped file: ~/Documents/Oracle/wallets/atp01/sqlnet.ora
You need to change the following in the file:
From: ?/network/admin
To: $TNS_ADMIN
You can also script this using sed
:
sed -i .bak "s|?/network/admin|\$TNS_ADMIN|g" $TNS_ADMIN/sqlnet.ora
You only need to change this once